В приложении 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.
Ну, теперь мне удалось решить проблему самостоятельно, с помощью документации MSDN.
Правильный оператор для выполнения хранимой процедуры через ODBC выглядит следующим образом:
OdbcCommand ODBCCommand = new OdbcCommand("{call getDetailsFromEmail (?)}", ODBCConnection);
ODBCCommand.CommandType = CommandType.StoredProcedure;
ODBCCommand.Parameters.AddWithValue("@KundenEmail", KundenEmail);
Тем не менее, спасибо за помощь, Торстен.
Не использовать ODBCConnection
для подключения к SQL Server. Используйте «обычный» SqlConnection
, SqlCommand
и т. д. Они предназначены для работы с SQL Server.
EDIT: Кроме того, вы должны использовать SqlConnectionStringBuilder
для сборки строки подключения. Это гораздо менее подвержено ошибкам, чем помещение всей строки подключения в файл конфигурации или создание ее вручную.
В любом случае лучше, чтобы ваш код выглядел так:
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. Синтаксис останется прежним.