我正在嘗試從 Access 資料庫中提取資料并使用該adapter.fill()方法將其顯示在 DataViewGrid 中,但一直收到錯誤訊息“沒有為一個或多個引數提供值”。這只發生在我嘗試通過串聯包含變數 userID、userPIN、accountNo 時。這三個變數取自先前表單的文本框資料。當我將查詢字串簡化為 時"SELECT * FROM STATEMENT",我只收到一個空白的 dataViewGrid,這也很奇怪。我已經搜索了幾天的解決方案,但無濟于事。任何幫助深表感謝。
string query = "select * from statement where userID = '" userID "' and userPIN ='" userPIN "' and account_no = " account_no; //cmd in string form for use with OleDbAdapter
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\ATM Project Folder\\Bank1.accdb";
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(query, conn);
// dataset object
DataSet ds = new DataSet();
adapter.Fill(ds);
// Bind dataset
dataGridView1.DataSource = ds.DefaultViewManager;
uj5u.com熱心網友回復:
讓我們正確地做到這一點:
string query = "select * from statement where userID = @u and userPIN = @p and account_no = @a"
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\ATM Project Folder\\Bank1.accdb";
var adapter = new OleDbDataAdapter(query, connString);
//call these in the same order that the placeholders appear in the sql. Ole does not use the names
//when you upgrade to sql server, cease using AddWithValue: https://www.dbdelta.com/addwithvalue-is-evil/
adapter.SelectCommand.Parameters.AddWithValue("@u", userID);
adapter.SelectCommand.Parameters.AddWithValue("@p", userPIN);
adapter.SelectCommand.Parameters.AddWithValue("@a", account_no);
var dt = new DataTable();
adapter.Fill(dt);
dataGridView1.DataSource = dt;
永遠不要像在問題中那樣撰寫 SQL;充其量,如果有人鍵入會產生語法錯誤的內容(例如撇號),它就會崩潰。在最壞的情況下,它會導致像vetch hack 這樣的事情,其中??超過 600 萬兒童的資料被暴露,僅僅是因為黑客可以將一段 sql 片段輸入網站并侵入資料庫
這真的很重要;將用戶提供的資料連接到您的 SQL 中是當今為黑客提供輕松訪問系統的主要方法之一。不要這樣做;始終可以更安全地操作
使用資料配接器獲取資料的最簡單方法是使用接受命令字串和連接字串的建構式,添加命令中包含的任何引數,然后呼叫 fill。DataAdapter 將為您管理連接。有些人丟棄了配接器;MSDN官方示例沒有,所以我省略了
Access OLE 理解@namedParameters,但仍按位置處理它們;您必須按照它們在陳述句中出現的順序將引數添加到命令物件。您擁有的另一個選擇是使用 ? 作為占位符。即使不使用名稱,也可以更輕松地除錯問題。更復雜的資料庫確實使用這些名稱,這意味著引數可以按任何順序提供,并且可以在 SQL 中重復,但在引數中提供一次。如果您確實升級到 SQLServer,請停止使用 AddWithValue,因為它可能會導致性能問題,但其他資料庫可能不在乎;逐案檢查
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455711.html
