代码之家  ›  专栏  ›  技术社区  ›  dhh

通过ODBC执行参数化SQL存储过程

  •  6
  • dhh  · 技术社区  · 14 年前

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

    5 回复  |  直到 13 年前
        1
  •  12
  •   dhh    14 年前

    嗯-我现在设法解决了我自己的问题,在一些帮助下,从MSDN文件。

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

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

    不过-谢谢你的帮助托尔斯滕。

        2
  •  5
  •   Grambot    9 年前

    虽然使用ODBC.NET提供程序执行参数化存储过程与使用SQL或oledb提供程序执行同一过程略有不同,但有一个重要的区别:必须使用ODBC调用语法而不是存储过程的名称来调用存储过程。

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

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

    {? =调用程序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(); }
        }
    
        3
  •  2
  •   abatishchev Karl Johan    10 年前

    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类型。语法将保持不变。

        4
  •  0
  •   Thorsten Dittmar    14 年前

    不要使用 ODBCConnection SqlConnection , SqlCommand ,等等。这些是用来与SQL Server一起工作的。

    SqlConnectionStringBuilder 组装连接字符串。这比将整个连接字符串放入配置文件或手动创建配置文件更不容易出错。

        5
  •  0
  •   Smajl    9 年前
     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);
    
     }