Execute Parameterized SQL StoredProcedure via ODBC

前端 未结 5 1065
一向
一向 2020-12-10 07:09

From within a C# WinForms app I must execute a parameterized Stored Procedure on a MS SQL Express Server. The Database Connection works, the Procedure works either, but I ge

相关标签:
5条回答
  • 2020-12-10 07:28
     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);
    
     }
    
    0 讨论(0)
  • 2020-12-10 07:36

    Well - I now managed to solve the problem on my own, with some help from the MSDN-documentation.

    The correct statement to execute a stored procedure via ODBC is as follows:

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

    Nevertheless - thanks for your help Thorsten.

    0 讨论(0)
  • 2020-12-10 07:42

    How To Execute SQL Parameterized Stored Procedures by Using the ODBC .NET Provider and Visual C# .NET

    While executing a parameterized stored procedure using the ODBC .NET Provider is little different from executing the same procedure using the SQL or the OLE DB Provider, there is one important difference: the stored procedure must be called using the ODBC CALL syntax rather than the name of the stored procedure.

    Call Syntax Examples

    Here is an example of the call syntax for an stored procedure that expects one input parameter:

    {CALL CustOrderHist (?)}

    Here is an example of the call syntax for a stored procedure that expects one input parameter and returns one output parameter and a return value. The first placeholder represents the return value:

    {? = CALL Procedure1 (?, ?)

    Sample Code

        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(); }
        }
    
    0 讨论(0)
  • 2020-12-10 07:43

    Don't use ODBCConnection to connect to a SQL Server. Use the "normal" SqlConnection, SqlCommand, etc. These are the ones made to work with SQL Server.

    EDIT: Also, you should use the SqlConnectionStringBuilder to assembly the connection string. This is far less error prone than putting the entire connection string into a configuration file or creating it by hand.

    0 讨论(0)
  • 2020-12-10 07:50

    Anyway it's better your code would look like this:

    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);
        }
    }
    

    But rather better to use SqlConnection/SqlCommand/SqlDataAdapter instead of ODBC types. Syntax will be still the same.

    0 讨论(0)
提交回复
热议问题