2011-09-29 56 views
2

如何傳遞由參數命名列列名,更新與參數

的榜樣

DataTable dt = new DataTable(); 

// Here I fill my datatable 

for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    for (int j = 0; j < dt.Columns.Count; j++) 
    { 
     string columnsname = dt.Rows[i][dt.columns[j].toString()].toString(); 
     SqlCommand comando = new SqlCommand(); 
     comando.commandText = "UPDATE Sales.Store SET @columnname = @demographics where id = @id"; 
     comando.Parameters.Add(new SqlParameter("@columnname", columname)); 
     comando.Parameters.Add(new SqlParameter("@dados2", dados2)); 
     comando.ExecuteNonQuery(); 
     comando.Clear(); 
     comando.Dispose() 
    } 
} 

這是不行的,但我有88列,我需要更新所有數據在每行的每88列中。

回答

2

您不能參數化列名稱。

要做你想要的,你需要求助於dynamic SQL

+0

但是,如果我在數據表中有30000行,並且我需要更新每個88列上的每個數據,那麼,如何將整個數據表傳遞給過程? –

+0

@ user965769 - 如果您使用SQL Server 2008及更高版本,則可以使用[Table Valued Parameters](http://msdn.microsoft.com/zh-cn/library/bb675163.aspx)。 – Oded

+0

是的,我有Sql Server 2008 Enterprise。要插入許多數據,我使用SqlBulkCopy類,我的疑問是如何動態更新,就像我上面所說的那樣。我將學習這個表值參數,看看它是否適用於我的項目。非常感謝! –

0

那麼,如果你有30,000行,88列,你需要更新所有88列,你可能想重新考慮你的數據庫模式。

Itay。

+0

我該如何做一個邏輯,只更新必須更新的列?,問題只是傳遞給comando.CommandText =「更新.....」 –

0

我已經想出了一種方法來包含參數化列名的解決方法。我有同樣的問題,但想出了一個不同的方式,因爲我將是唯一使用列名的人,那麼我相信這仍然是一個安全的選擇。

  String sqlcomm = "SELECT * FROM Asset WHERE " + assetColName + " = "; 
      command.CommandText = sqlcomm + "$assetColValue"; 

      //command.CommandText = @"SELECT * FROM Asset WHERE $assetColName = '$assetColValue'"; 
      //command.Parameters.AddWithValue("$assetColName", assetColName); 

      command.Parameters.AddWithValue("$assetColValue", assetColValue); 

正如你可以從上面的代碼看到的。我幾乎嘗試了你所做的,然後我不得不發表評論。然後我將字符串連接在一起,並能夠使用我的參數化列名和值,然後將值安全地添加。然而,列名不安全,但這是一種只有我會使用的方法,所以它仍然有點安全。如果您希望更安全,您可以添加正則表達式,但您可以瞭解修正。