Иногда не удается выполнить запрос параметров Microsoft Access - PullRequest
0 голосов
/ 26 августа 2009

У меня есть запрос, который, в основном, говорит это:

SELECT DISTINCT [DB_ID]
FROM [TableX]
WHERE ([ForeignKey]=@ForeignKey);

Получив это, я возвращаю первый DB_ID (должен быть только один).

Процедура, которую я написал для вызова этого, написана на C #, чтобы я мог получить идентификатор базы данных для любого имени таблицы, независимо от того, как назван DB_ID.

Большинство параметров ForeignKey являются целыми числами, но некоторые являются строковыми значениями. Чтобы добавить значение параметра, я использую

Parameter.AddWithValue(ForeignKeyName, objValue);

Эта процедура прекрасно работает с существующими идентификаторами базы данных; однако, когда ForeignKey не найден, он возвращает 3 вместо нуля.

Я понимаю, что мог бы использовать метод грубой силы и просто написать два стиля операторов SQL (один для принятия целого числа, другой для принятия строки) и вообще избежать параметра, но я хочу знать и понимать, почему этот параметризованный рутина не работает.

Может кто-нибудь объяснить мне, почему это не работает?

/// <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}]=@id);", 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;
}

ВФ

1 Ответ

1 голос
/ 11 сентября 2009

Возвращаясь к этому: оказалось, что другой разработчик работал над тем же проектом, и он скопировал другую базу данных для работы с пустой таблицей.

Один час в этой таблице были записи, в следующий час - нет!

Короче говоря, приведенный выше фрагмент кода работает.

...