2009-08-26 8 views
0

ich eine Abfrage, die, im Grunde das, sagt:Microsoft Access-Parameter-Abfrage schlägt fehl Gelegentlich

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

Sobald ich das habe, kehre ich das erste DB_ID (es sollte nur eine sein).

Die Routine, die ich für den Aufruf geschrieben habe, ist in C#, so dass ich die Datenbank-ID für jeden Tabellennamen abrufen kann, egal, was die DB_ID benannt ist.

Die meisten ForeignKey-Parameter sind Ganzzahlen, aber einige sind String-Werte. Um den Parameterwert hinzuzufügen, verwende ich

Diese Routine funktioniert fantastisch mit vorhandenen Datenbank-IDs; Wenn jedoch kein ForeignKey gefunden wird, wird 3 anstelle von null zurückgegeben.

Ich realisiere, dass ich die Brute-Force-Technik verwenden und einfach zwei Arten von SQL-Anweisungen schreiben kann (einen, um einen Integer zu akzeptieren, den anderen, um einen String zu akzeptieren) und den Parameter komplett vermeiden, aber ich möchte wissen und verstehen warum Die parametrisierte Routine funktioniert nicht.

Könnte mir bitte jemand erklären, warum das nicht funktioniert?

/// <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

Antwort

1

dieser Neubetrachtung: Es stellte sich heraus, ein anderer Entwickler an einem Projekt arbeitete, und er hatte über eine andere Datenbank kopiert, auf dem arbeiten, um eine leere Tabelle hatte.

Eine Stunde, die Tabelle hatte Aufzeichnungen, die nächste Stunde hat es nicht!

Kurz gesagt, funktioniert das Code-Snippet oben.