簡體   English   中英

通過ODBC執行參數化SQL StoredProcedure

[英]Execute Parameterized SQL StoredProcedure via ODBC

在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類型。 語法仍然是一樣的。

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

 }

不要使用ODBCConnection連接到SQL Server。 使用“普通” SqlConnectionSqlCommand等。這些是與SQL Server一起使用的。

編輯:此外,您應該使用SqlConnectionStringBuilder來組裝連接字符串。 這比將整個連接字符串放入配置文件或手動創建它更不容易出錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM