Выполнение параметризованного SQL StoredProcedure через ODBC

из приложения c# WinForms я должен выполнить параметризованную хранимую процедуру на сервере MS SQL Express. Соединение с базой данных работает, процедура работает, но я получаю сообщение об ошибке:

42000: Отсутствует Параметр '@KundenEmail'

хотя я уверен, что правильно добавил параметр. Может, кто - нибудь из вас посмотрит-я не знаю, что еще искать...

OdbcConnection ODBCConnection = new OdbcConnection();

try
{
    ODBCConnection.ConnectionString = ODBCConnectionString;
    ODBCConnection.Open();
}
catch (Exception DatabaseConnectionEx)
{
    if (ODBCConnection != null)
        ODBCConnection.Dispose();

    // Error Message

    return null;
}

OdbcParameter ODBCParameter = new OdbcParameter("@KundenEmail", OdbcType.NChar, 50);
ODBCParameter.Value = KundenEmail;

OdbcCommand ODBCCommand = new OdbcCommand("getDetailsFromEmail", ODBCConnection);
ODBCCommand.CommandType = CommandType.StoredProcedure;
ODBCCommand.Parameters.Add(ODBCParameter);

DataTable DataTable = new DataTable();

OdbcDataAdapter ODBCDatadapter = new OdbcDataAdapter(ODBCCommand);
ODBCDatadapter.Fill(DataTable);
ODBCDatadapter.Dispose();

ODBCConnection.Close();
ODBCConnection.Dispose();

это сообщение об ошибке I получить:

ошибка [4200] [Microsoft][ODBC SQL Server]процедура или метод 'getDetailsFromEmail ' ожидает'@KundenEmail ' -параметр, который не было поставлено.

Ах, я пропустил строку подключения

private static String ODBCConnectionString = "Driver={SQL Server};Server=TESTSRVSQLEXPRESS;Database=TestDatabase;";

какие идеи? Спасибо заранее.

5 ответов


Ну-теперь мне удалось решить проблему самостоятельно, с некоторой помощью MSDN-документации.

правильный оператор для выполнения хранимой процедуры через ODBC выглядит следующим образом:

OdbcCommand ODBCCommand = new OdbcCommand("{call getDetailsFromEmail (?)}", ODBCConnection);
ODBCCommand.CommandType = CommandType.StoredProcedure;
ODBCCommand.Parameters.AddWithValue("@KundenEmail", KundenEmail);

тем не менее - спасибо за вашу помощь Торстен.


Как выполнить SQL параметризованные хранимые процедуры с помощью поставщика ODBC .NET и Visual C# .NET

при выполнении параметризованной хранимой процедуры с помощью поставщика ODBC .NET мало чем отличается от выполнения той же процедуры с помощью SQL или поставщика OLE DB, есть одно важное отличие: хранимая процедура должна вызываться с использованием синтаксиса вызова ODBC, а не имени хранимой процедуры.

Синтаксис Вызова Примеры

вот пример синтаксиса вызова хранимой процедуры, которая ожидает один входной параметр:

{вызов CustOrderHist (?)}

вот пример из синтаксис вызова хранимой процедуры, которая ожидает один входной параметр и возвращает один выходной параметр и возвращаемое значение. Первый заполнитель представляет возвращаемое значение:

{? = Вызов Procedure1 (?, ?)

Пример Кода

    public static void SheduleDocuments(int siteid, int docid)
    {

        DataTable objDt = new DataTable();
        OdbcConnection odbccon = new OdbcConnection();
        try
        {
            odbccon.ConnectionString =
             "Dsn=Dsn;" +
             "Uid=databaseuserid;" +
             "Pwd=databasepassword;";
            odbccon.Open();

            OdbcCommand cmd = new OdbcCommand("{call usp_GetEmpDetailsByIDanddepid(?,?)", odbccon);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@siteid", siteid);
            cmd.Parameters.AddWithValue("@DocumentIDs", docid);
            cmd.ExecuteNonQuery();
        }
        catch (OdbcException objEx)
        {
            string str = objEx.Message;
        }
        finally { odbccon.Close(); }
    }

в любом случае лучше, чтобы ваш код выглядел так:

using (OdbcConnection connection = new OdbcConnection(connectionString) )
using (OdbcCommand command = connection.CreateCommand())
{
    command.CommandText = commandText;
    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.Add("@KundenEmail", OdbcType.NChar, 50).Value = KundenEmail

    DataTable dataTable = new DataTable();

    connection.Open();

    using (OdbcDataAdapter adapter = new OdbcDataAdapter(command))
    {
        adapter.Fill(dataTable);
    }
}

но лучше использовать SqlConnection/SqlCommand / SqlDataAdapter вместо типов ODBC. Синтаксис останется прежним.


не используйте ODBCConnection для подключения к SQL Server. Используйте "нормальный"SqlConnection, SqlCommand, etc. Они предназначены для работы с SQL Server.

EDIT: кроме того, вы должны использовать SqlConnectionStringBuilder для сборки строки подключения. Это гораздо менее подвержено ошибкам, чем поместить всю строку подключения в файл конфигурации или создать ее вручную.


 private void button1_Click(object sender, EventArgs e)
 {
    OdbcCommand cmd = new OdbcCommand(" call prc_st(?)",con);
    cmd.Parameters.Add(new OdbcParameter("@id", "1"));
    cmd.CommandType = CommandType.StoredProcedure;
    OdbcDataAdapter adp = new OdbcDataAdapter(cmd);
    DataSet ds = new DataSet();
    adp.Fill(ds);

 }