2016-09-18 8 views
-1

データベース内でCalculatedというテーブルを更新する必要がありますが、テーブルに追加/更新する変数として自分のシステムに保存した値が非常に多いためです私はDatabase Relationshipsという名前のデータベースに別のテーブルを作成しました。データベース名を使用して同じ名前の変数を呼び出す

このDatabase Relationshipsテーブルには、テーブルのすべてのフィールド名を保持するCalculated Valueという列があります。他の列は、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には、名前を保持する2つの列があります。どこに値を挿入したいですか? – sachin

+0

私はそれらの質問に追加しませんでした。 同じ名前の変数は、たとえば、 "king"という変数を作成し、値が "George"であるということです。したがって、この変数 'king'は' King's Name'フィールドの 'Calculated'というテーブルに格納する必要があります。しかし、私はこれらの変数のうち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」または「i」の値を変更することはありません。

+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を生成している同じスコープにスコープされていることを前提としています。

関連する問題