Выполнить параметризованную хранимую процедуру SQL через ODBC

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

42000: отсутствует параметр '@KundenEmail'

, хотя я уверен, что я правильно добавил параметр. 'getDetailsFromEmail' expects the '@KundenEmail'-parameter, which was not supplied.

Ah, I missed the connection string

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

Any ideas? Thanks in advance.

7
задан abatishchev 19 May 2011 в 11:46
поделиться

3 ответа

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

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

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

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

9
ответ дан 6 December 2019 в 12:45
поделиться

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

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

0
ответ дан 6 December 2019 в 12:45
поделиться

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

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

2
ответ дан 6 December 2019 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: