Выполнить параметризованный SQL StoredProcedure через ODBC - PullRequest
7 голосов
/ 27 августа 2010

В приложении 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();

Это сообщение об ошибке, которое я получаю:

ОШИБКА [4200] [Microsoft] [ODBC SQL Server] Процедура или метод 'getDetailsFromEmail' ожидает параметр @ KundenEmail, который не был поставлен.

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

private static String ODBCConnectionString = "Driver={SQL Server};Server=TESTSRV\\SQLEXPRESS;Database=TestDatabase;";

Есть идеи? Заранее спасибо.

Ответы [ 5 ]

8 голосов
/ 27 августа 2010

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

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

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

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

5 голосов
/ 28 мая 2014

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

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

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

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

{CALL CustOrderHist (?)}

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

{?= ВЫЗОВ Процедура1 (?,?)

Пример кода

    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(); }
    }
2 голосов
/ 27 августа 2010

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

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. Синтаксис будет прежним.

0 голосов
/ 26 октября 2015
 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);

 }
0 голосов
/ 27 августа 2010

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

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

...