2011-11-30 19 views
1

私は2列のDataTable dtを持っています。最初のcol(CustomerIdという名前)は一意であり、NULLを許可しません。 2つ目はヌルを許可し、一意ではありません。DataTable findまたは見つからない場合行を挿入

メソッドから私はCustomerIdを取得し、このCustomerIdが存在しない場合は新しいレコードを挿入するか、そのCustomerIdに対応する2番目の列にあるものを1つ増やしたいと思います。

私はこれにどのようにアプローチすべきか分かりません。 select文(System.Data.DataRowを返す)を書きましたが、空の文字列が返されたかどうかをテストする方法はわかりません。

現在、私は持っている:

//I want to insert a new row 
if (dt.Select("CustomerId ='" + customerId + "'") == null) //Always true :| 
    { 
     DataRow dr = dt.NewRow(); 
     dr["CustomerId"] = customerId; 
    } 

答えて

1

データベースによってデータテーブルが作成されている場合。私はcustomeridをID列にすることをお勧めします。そのようにして、新しい行を追加すると、それは以前のIDよりも一意になる新しいcustomeridが自動的に作成されます(ID列の設定に応じて)

返される行数をチェックしますselectステートメント

私もString.Formatのを使用するような何か...

だからそれがこの

var selectStatement = string.Format("CustomerId = {0}", customerId); 
var rows = dt.Select(selectStatement); 
if (rows.Count < 1){ 
    var dr = dt.NewRow(); 
    dr["CustomerId"] = customerId; 
} 
-1

Select方法は、DataRowオブジェクトの配列を返します。その長さが0であることを確認してください(それは決してnullです)。

ところで、この例のようにコードにこのようなステートメントを直接記述しないでください。コードのセキュリティを "SQLインジェクション"と呼ぶ手法がありますが、Wikipedia Articleを読むことをお勧めします。簡単に言えば、経験豊富なユーザーはデータベースから実行されるSQLスクリプトを作成し、ユーザーからcustomerIdを文字列として受け取った場合に有害な行為を行う可能性があります。私はデータベースプログラミングに慣れていませんが、これはまさに "一般知識"です...

0

このようになりますが、同様の問題を解決するための私の方法です。ニーズに合わせて変更することができます。

public static bool ImportRowIfNotExists(DataTable dataTable, DataRow dataRow, string keyColumnName) 
{ 
    string selectStatement = string.Format("{0} = '{1}'", keyColumnName, dataRow[keyColumnName]); 
    DataRow[] rows = dataTable.Select(selectStatement); 
    if (rows.Length == 0) 
    { 
     dataTable.ImportRow(dataRow); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
}