2009-08-26 5 views
0

を失敗する私は、基本的に、これは言って、そのクエリをしている:私はこれを持っていたらのMicrosoft Accessパラメータークエリ時々

SELECT DISTINCT [DB_ID] 
FROM [TableX] 
WHERE ([ForeignKey][email protected]); 

、私は(一つだけがあるはずです)最初DB_IDを返します。

これを呼び出すために書いたルーチンは、DB_IDの名前に関係なく、テーブル名のデータベースIDを取得できるようにC#で書かれています。

ForeignKeyパラメータのほとんどは整数ですが、一部は文字列値です。パラメータ値を追加するには、

Parameter.AddWithValue(ForeignKeyName, objValue); 

このルーチンは、既存のデータベースIDで幻想的です。ただし、ForeignKeyが見つからない場合は、nullではなく3が返されます。

私はブルートフォース技術を使用し、単純に2つのスタイルのSQL文(Integerを受け入れ、もう1つはStringを受け入れる)を作成し、パラメータを完全に避けることができることを理解します。パラメータ化されたルーチンが機能していません。

誰かがなぜこれが機能しないのか説明してください。それは別の開発者が同じプロジェクトに取り組んでいたが判明し、彼は空のテーブルを持っていた上で動作するように、別のデータベースにコピーしていた:これを再考

/// <summary> 
/// Locates the Primary Key Value for a Table using the Table's Foreign Key 
/// </summary> 
/// <param name="tableName">Name of the Table to Delete from</param> 
/// <param name="primaryKey">Name of the Primary Key in the Table</param> 
/// <param name="foreignKey">Name of the Foreign Key in the Table</param> 
/// <param name="id">Foreign Key Value to Search for in the Table</param> 
/// <returns>Primary Key Database ID for this Table Record</returns> 
List<int> tableSelectId(string tableName, string primaryKey, string foreignKey, object id) { 
    string sqlText = string.Format("SELECT DISTINCT [{0}] " + 
    "FROM [{1}] WHERE ([{2}][email protected]);", primaryKey, tableName, foreignKey); 
    DataTable table = new DataTable("IDs"); 
    OleDbDataAdapter da = new OleDbDataAdapter(sqlText, AccessConnection); 
    da.SelectCommand.Parameters.AddWithValue("@id", id); 
    try { 
    da.Fill(table); 
    } catch (OleDbException err) { 
    clsLogger.LogException((Exception)err); 
    } 
    List<int> vals = new List<int>(table.Rows.Count); 
    foreach (DataRow row in table.Rows) { 
    vals.Add((int)row[0]); 
    } 
    return vals; 
} 

EOF

答えて

1

テーブルにはレコードが1時間あり、次の時間はありませんでした!

要するに、上記のコードスニペットが機能します。