2009-08-26 6 views
0

J'ai une requête qui, au fond, dit ceci:Microsoft Access paramètre de requête ne réussit pas de temps en temps

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

Une fois que j'ai, je retourne le premier DB_ID (il devrait y avoir qu'un seul).

La routine que j'ai écrite pour l'appeler est en C# afin que je puisse obtenir l'ID de base de données pour n'importe quel nom de table, quel que soit le nom de DB_ID.

La plupart des paramètres ForeignKey sont des entiers, mais certains sont des valeurs String. Pour ajouter la valeur du paramètre, puis, j'utilise

Parameter.AddWithValue(ForeignKeyName, objValue); 

Cette routine fonctionne fantastique avec les ID de base de données existants; cependant, lorsqu'une clé étrangère n'est pas trouvée, elle renvoie 3 au lieu d'une valeur nulle. Je réalise que je pourrais utiliser la technique de la force brute et écrire simplement deux styles d'instructions SQL (une pour accepter un entier, l'autre pour accepter une chaîne) et éviter complètement le paramètre, mais je veux savoir et comprendre pourquoi La routine paramétrée ne fonctionne pas.

Quelqu'un pourrait-il m'expliquer pourquoi cela ne fonctionne pas?

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

Répondre

1

Revisiter ceci: Il est apparu un autre développeur travaillait sur le même projet et il avait copié sur une autre base de données pour travailler sur ce qui avait une table vide.

Une heure cette table avait des enregistrements, l'heure suivante, il n'a pas!

En bref, l'extrait de code ci-dessus fonctionne.

Questions connexes