Выполнение параметризованного 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);
}