通过ODBC执行参数化SQL StoredProcedure

在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;"; 

有任何想法吗? 提前致谢。

好吧 – 我现在设法通过MSDN文档的一些帮助自己解决问题。

通过ODBC执行存储过程的正确语句如下:

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

不过 – 谢谢你的帮助Thorsten。

如何使用ODBC .NET提供程序和Visual C#.NET执行SQL参数化存储过程

使用ODBC .NET提供程序执行参数化存储过程与使用SQL或OLE DB提供程序执行相同过程几乎没有区别,但有一个重要区别:必须使用ODBC CALL语法而不是名称来调用存储过程存储过程。

调用语法示例

以下是需要一个输入参数的存储过程的调用语法示例:

{CALL CustOrderHist(?)}

下面是存储过程的调用语法示例,它需要一个输入参数并返回一个输出参数和一个返回值。 第一个占位符表示返回值:

{? = CALL 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。 使用“普通” SqlConnectionSqlCommand等。这些是与SQL Server一起使用的。

编辑:此外,您应该使用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); }