通过ODBC执行参数化SQL StoredProcedure

dhh*_*dhh 7 c# ado.net odbc stored-procedures winforms

在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();
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息:

错误[4200] [Microsoft] [ODBC SQL Server]过程或方法'getDetailsFromEmail'需要'@ KundenEmail'参数,该参数未提供.

啊,我错过了连接字符串

private static String ODBCConnectionString = "Driver={SQL Server};Server=TESTSRV\\SQLEXPRESS;Database=TestDatabase;";
Run Code Online (Sandbox Code Playgroud)

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

dhh*_*dhh 9

好吧 - 我现在设法自己解决这个问题,在MSDN文档的帮助下.

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

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

不过 - 谢谢你的帮助Thorsten.


小智 5

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

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

呼叫语法范例

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

{致电CustOrderHist(?)}

这是存储过程的调用语法的示例,该存储过程期望一个输入参数并返回一个输出参数和一个返回值。第一个占位符代表返回值:

{?=呼叫程序1(?,?)

样例代码

    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(); }
    }
Run Code Online (Sandbox Code Playgroud)