簡體   English   中英

將多個SqlParameter傳遞給方法

[英]Passing multiple SqlParameter to method

在我的主要表單中,我已實現此代碼..

void SampleMethod(string name, string lastName, string database)
{
        SqlParameter sqlParam = new SqlParameter();
        sqlParam.ParameterName = "@name";
        sqlParam.Value = name;
        sqlParam.SqlDbType = SqlDbType.NVarChar;

        SqlParameter sqlParam1 = new SqlParameter();
        sqlParam1.ParameterName = "@lastName";
        sqlParam1.Value = lastName;
        sqlParam1.SqlDbType = SqlDbType.NVarChar;

        SqlParameter sqlParam2 = new SqlParameter();
        sqlParam2.ParameterName = "@database";
        sqlParam2.Value = database;
        sqlParam2.SqlDbType = SqlDbType.NVarChar;

        SampleClass sampleClass = new SampleClass(new DBConn(@serverName, tableName, userName, password));
        sampleClass.executeStoredProc(dataGridView1, "sp_sampleStoredProc", sqlParam, sqlParam1, sqlParam2);
}

在我的SampleClass ,我有這種方法。

public DataGridView executeStoredProc(DataGridView dtgrdView, string storedProcName, params SqlParameter[] parameters)
{
        try
        {
            DataTable dt = new DataTable();
            sqlDA = new SqlDataAdapter(storedProcName, sqlconn);
            sqlDA.SelectCommand.CommandType = CommandType.StoredProcedure;
            sqlDA.SelectCommand.CommandTimeout = 60;

            // Loop through passed parameters
            if (parameters != null && parameters.Length > 0)
            {
                foreach (var p in parameters)
                    sqlDA.SelectCommand.Parameters.Add(p);
            }

            sqlDA.Fill(dt);
            dtgrdView.DataSource = dt;
            sqlconn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            sqlconn.Close();
        }

        return dtgrdView;
}

我想做的是避免多重

SqlParameter sqlParam = new SqlParameter() 

在我的代碼中,我已經為這個問題嘗試了很多解決方案,但我沒有得到正確的答案。 我也嘗試過對此進行研究,但我仍然無法得到正確答案。

請不要介意我的命名約定和其他代碼,因為我故意改變其中許多:)謝謝。

作為您的解決方案的替代方案,請嘗試使用已有的解決方案,使用Dapper( https://github.com/StackExchange/dapper-dot-net )。

如果您的存儲過程或查詢需要,您仍然需要使用多個參數,但這很好地為您抽象,這將最終減少代碼量。

void SampleMethod(string name, string lastName, string database)
{
    using(var connection = new SqlConnection(MY_CONNECTION_STRING))
    {
        var resultListOfRows = connection.Query<ReturnObject>(MY_STORED_PROCEDURE, new { 
            name = name,
            lastName = lastName,
            database = database}, commandType: System.Data.CommandType.StoredProcedure);
    }
}

在一個地方分離你的數據庫邏輯(把sqladapter,sqlcommand等放在一個地方),然后在你的命令中封裝參數,如下所述,你不需要單獨聲明sqlparameter,將它添加到參數列表中。

 cmdToExecute.Parameters.Add(new SqlParameter("@parameter", value));

看看下面的完整示例

    public DataTable ProdTypeSelectAll(string cultureCode)
    {
        SqlCommand cmdToExecute = new SqlCommand();
        cmdToExecute.CommandText = "dbo.[pk_ProdType_SelectAll]";
        cmdToExecute.CommandType = CommandType.StoredProcedure;
        DataTable toReturn = new DataTable("ProdType");
        SqlDataAdapter adapter = new SqlDataAdapter(cmdToExecute);
        cmdToExecute.Connection = _mainConnection;
        cmdToExecute.Parameters.Add(new SqlParameter("@CultureName", cultureCode));
        _mainConnection.Open();
        adapter.Fill(toReturn);
        return toReturn;
}

首先,最簡單的選擇是使用像Dapper這樣的microORM,並檢索強類型集合。 Gridview可以綁定到任何東西,包括強類型集合。 所有這些代碼都可能成為:

using(var con=new SqlConnection(myConnectionString))
{
    con.Open();
    var result= connection.Query<ResultClass>("sp_MySproc", 
                         new { Name= name, LastName= lastName,Database=database},
                         commandType: CommandType.StoredProcedure);
    return result;
}

即使使用原始ADO.NET,也可以使用適當的構造函數在一行中創建SqlParameter。 例如,您可以使用以下命令創建新的nvarchar(n)參數:

var myParam=new SqlParameter("@name",SqlDbType.NVarchar,20);

要么

var myParam=new SqlParameter("@name",SqlDbType.NVarchar,20){Value = name};

但更好的想法是只創建一次SqlCommand對象並重用它。 一旦有了初始化的SqlCommand對象,就可以簡單地設置一個新連接並更改參數值,例如:

public void Init()
{
    _loadCustomers = new SqlCommand(...);
    _loadCustomers.Parameters.Add("@name",SqlDbType.NVarChar,20);
    ...
}

//In another method :
using(var con=new SqlConnection(myConnectionString)
{       
    _loadCustomers.Connection=con;
    _loadCustomers.Parameters["@name"].Value = myNameParam;
    con.Open();
    using(var reader=_load.ExecuteReader())
    {
    //...
    }
}

您可以使用SqlDataAdapter執行相同的操作,事實上,自.NET 1.0以來,Windows Forms和數據適配器的使用方式就是這樣。

每次要填充網格時,不要創建新的網格,而是創建一個網格並通過在執行前設置連接和參數來重復使用它。 您可以使用SqlDataAdapter(SqlCommand)構造函數使事情更清晰:

public void Init()
{
    _loadCustomers = new SqlCommand(...);
    _loadCustomers.Parameters.Add("@name",SqlDbType.NVarChar,20);
    ....
    _myGridAdapter = new SqlDataAdapter(_loadCustomers);
    ...
}

並稱之為:

using(var con=new SqlConnection(myConnectionString))
{
    _myGridAdapter.SelectCommand.Connection=con;
    _myGridAdapter.SelectCommand.Parameters["@name"].Value =....;
    con.Open();

    var dt = new DataTable();
    _myGridAdapter.Fill(dt);
    dtgrdView.DataSource = dt;
    return dtgrdView;
}

您可以使用SqlParameter構造函數(String,Object) 更換:

sampleClass.executeStoredProc(dataGridView1,
        "sp_sampleStoredProc",
        sqlParam,
        sqlParam1,
        sqlParam2);

附:

sampleClass.executeStoredProc(dataGridView1,
        "sp_sampleStoredProc",
        new SqlParameter("@name", (object)name),
        new SqlParameter("@lastName", (object)lastName),
        new SqlParameter("@database", (object)database));

但是,這樣做不太可能使您的代碼更快,但會降低可讀性。

暫無
暫無

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

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