看起來你有你的答案,但我想從您的示例代碼,指出幾件事情:
sqlQuery = "SELECT [ID] from [users] WHERE [email protected]";
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
cmd = new OleDbCommand(sqlQuery, conn);
cmd.CommandText = sqlQuery;
cmd.Parameters.Add("@CallerName", OleDbType.VarChar).Value = labelProblemDate.Text.Trim();
cmd.Parameters["@CallerName"].Value = name;
cmd.ExecuteNonQuery();
conn.Close();
首先,請注意你的SQL查詢使用Microsoft SQL語法,並且Microsoft Access更喜歡稍微不同的語法。相反,包裹在方括號中列名的,使用波浪號:
sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`[email protected]";
接下來,在你的SQL查詢,請注意,Microsoft Access不接受命名參數。你的SQL文本上面使用@CallerName
將沒有問題執行,但所有的OleDb對象將看到的是這樣的:
sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?";
如果在某一點後,你決定去與存儲過程而不是文字SQL,記得在添加參數和執行命令之前,在OleDbCommand
上調用Prepare()。
如果您有多個參數,請確保按照您在SQL文本中調用它們的順序將這些參數添加到OleDbCommand
。 OleDb並不在乎你的名字,但你可以自己使用它們來幫助你;它不在查詢中使用。 @CallerName
將不會嘗試與您的SQL文本中的任何內容匹配。
接下來,我想看看您使用OleDbParameter
項目。在下面的兩行中,您將爲OleDbCommand
添加一個(1)參數,其值爲labelProblemDate.Text.Trim()並且在下一行中您將重新指定爲將同一參數值重新分配給變量(這對我們來說是未知的)稱爲name
。如果用一個值聲明該參數,然後將其重新分配給其他值,那沒有用。
您也可以使用以下修改的摘錄,並得到了相同的結果(記得要加的大小字段,如下圖所示,在數據庫中指定):
cmd.Parameters.Add("@CallerName", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim();
// cmd.Parameters["@CallerName"].Value = name;
同樣,你OleDbCommand
正在與創建您sqlQuery
參數,因此指定你的命令的CommandText
屬性是不必要的:
cmd = new OleDbCommand(sqlQuery, conn);
//cmd.CommandText = sqlQuery;
最後,正如其他人所說,如果你想查詢你的數據,你的SQL語句建議,你必須讀取數據,而不是調用ExecuteNonQuery()
(請注意,它被稱爲非查詢)。
概括起來講,我寫出來的位置:
sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?";
int result = 0;
OleDbConnection conn = new OleDbConnection(connectionString);
try {
conn.Open();
var cmd = new OleDbCommand(sqlQuery, conn);
//cmd.CommandText = sqlQuery; This command was specified by your initializer
cmd.Parameters.Add("?", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim();
//cmd.Parameters["@CallerName"].Value = name; Possible bug here
using (OleDbDataReader reader = cmd.ExecuteReader())
{
if(reader.HasRows)
{
reader.Read();
result = reader.GetInt32(0);
}
}
} finally {
conn.Close();
}
return result;
始終把情況在finally
塊的關閉程序拋出一個錯誤的任何理由。這可以防止應用程序崩潰並使文件保持打開狀態。我發現,一個using
條款在完成時並不一定會關閉連接(就像它們應該這樣做)。
我希望這會有所幫助。我現在刷新了我對OleDb
的瞭解,並想指出一些事情。
你收到了哪些錯誤信息?另外,你似乎混淆了你的'@ CallerName'參數。什麼是變量「名稱」,並且「ExecuteNonQuery」將不會執行選擇。 – Ste 2012-04-27 16:36:40
你想要所有的ID都有這個名字嗎?如果後者最好'SELECT TOP 1 ID FROM [users] WHERE CallerName = @ CallerName'。然後使用['ExecuteScalar'](http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executescalar.aspx)(內部鏈接)檢索只有一個選定的ID(如果有的話) )。 – 2012-04-27 16:40:52