在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;";
有什么想法吗?提前谢谢。
答案 0 :(得分:8)
嗯 - 我现在设法自己解决了这个问题,并得到了MSDN文档的一些帮助。
通过ODBC执行存储过程的正确语句如下:
OdbcCommand ODBCCommand = new OdbcCommand("{call getDetailsFromEmail (?)}", ODBCConnection);
ODBCCommand.CommandType = CommandType.StoredProcedure;
ODBCCommand.Parameters.AddWithValue("@KundenEmail", KundenEmail);
尽管如此 - 感谢你的帮助Thorsten。
答案 1 :(得分:4)
如何使用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(); }
}
答案 2 :(得分:2)
无论如何,你的代码看起来会更好:
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类型。语法仍然是一样的。
答案 3 :(得分:0)
不要使用ODBCConnection
连接到SQL Server。使用“普通”SqlConnection
,SqlCommand
等。这些是与SQL Server一起使用的。
编辑:此外,您应该使用SqlConnectionStringBuilder
来组装连接字符串。这比将整个连接字符串放入配置文件或手动创建它更不容易出错。
答案 4 :(得分:0)
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);
}