2016-09-18 78 views
-1

我需要更新的表在我的數據庫稱爲Calculated,但因爲我有我已經保存在我的系統這麼多值變量,在表中添加/更新,我在數據庫中創建了一個名爲Database Relationships的單獨表格。使用數據庫值來調用一個變量名稱相同

Database Relationships表具有名爲Calculated Value的列,該列包含Calculated表的所有字段名稱。另一列System Field保存的是我已經創建並給變量賦值,這些都是string類型的所有名稱和因此,通過使用一個FOREACH循環

OleDbDataAdapter relationshipAdapter = new OleDbDataAdapter(relationshipCmd); 
DataTable relationshipTable = new DataTable(); 
relationshipAdapter.Fill(relationshipTable); 

string update = "Update [Calculated] SET "; 
int i = 0; 
int len = relationshipTable.Rows.Count; 
foreach (DataRow drr in relationshipTable.Rows) 
{ 
    string calc = drr["Calculated Field"].ToString(); 
    var sys = drr["System Field"].ToString(); 
    if (i == len - 1) 
    { 
     update += "[" + calc + "] = " + sys + ";"; 
    } 
    else 
    { 
     update += "[" + calc + "] = " + sys + ", "; 
    } 
i++ 

} 
update += "WHERE [NSN] = '" + NSN + "';"; 
OleDbCommand updateCmd = new OleDbCommand(update); 

涉及到相應的Calculated Value

但是這不起作用,因爲經過一些調試(?),我做了一個簡單的Console.WriteLine(sys),它將打印出System Field列中的字符串,而不是系統中具有相同名稱的變量。

我目前使用Microsoft Access作爲我的數據庫平臺。

+0

你是什麼意思的系統中的同名變量?這些定義或範圍在哪裏?我在代碼中沒有看到任何這樣的變量。 – sachin

+0

你說過,在表DataBaseRelationships中有兩列都包含名稱。那麼你想在哪裏插入值? – sachin

+0

我沒有添加他們的問題,因爲有像他們112。 我的意思相同名稱的變量,是例如,我創建了一個名爲'king'變化的,「喬治」的值。因此,這個變量'king'需要存儲在名爲'Calculated'的表格中,在King's Name字段下。但是因爲我有超過112個這樣的變量,所以創建一個'UPDATE'語句會有點太大,很難跟蹤。 – Kingler

回答

0

我認爲有「中間」表在另一個表日後節省運行時的臨時存儲值聽起來有點複雜,申辦對我來說。

如果你想在數據庫映射在運行時與列名的變量 - 使用詞典,例如:

Dictionary<string, string> myValues = new Dictionary<string, string>(); 

使用中的應用:

myValues["SomeColumn"] = "your value"; 

然後將數據保存到數據庫將:

var updateCmd = new OleDbCommand(); 
var query = new StringBuilder(); 
foreach(KeyValuePair<string, string> value in myValues) 
{ 
    string columnName = value.Key; 
    query.AppendLine($", {columnName} = ?"); 
    var param = new OleDbParameter("@v", value.Value); 
    // Name of parameter not important, only order 
} 

if(query.Length > 0) 
{ 
    query.Remove(0, 1); // Remove first ',' character 
    query.Insert("Update [Calculated] SET "); 
    query.AppendLine("$WHERE [NSN] = '{NSN}';"); 
} 

updateCmd.CommandText = query.ToString(); 

非常重要:您需要使用OleDbParameter用於將值傳遞給查詢。

-1

在循環,使用條件:

if (i == len - 1) 

,但你永遠不會改變的代碼爲「len」或「我」的價值。

+0

是的,我已經意識到,並且已經做了一個編輯,但這與我問的問題無關 – Kingler

0

在你foreach循環,使用此:

if (i == len - 1) 
{ 
    update += "[" + calc + "] = " + this.GetType().GetProperty(sys).GetValue(this, null)+ ";"; 
} 
else 
{ 
    update += "[" + calc + "] = " + this.GetType().GetProperty(sys).GetValue(this, null)+ ", "; 
} 

上面的代碼假定變量在你生成的SQL範圍相同範圍的。

相關問題