2012-11-18 89 views
3

我有以下代碼,它嘗試將3個文本框的e值存儲到MS Access 2007數據庫中。無法使用c中的參數化查詢在MS Access中插入數據#

string ConnString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dxs.accdb"); 
string SqlString = "Insert Into tests([Nam], [add], [phone]) Values (?,?,?)"; 

using (OleDbConnection conn = new OleDbConnection(ConnString)) 
{ 
    using (OleDbCommand cmd = new OleDbCommand(SqlString, conn)) 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.Parameters.AddWithValue(@"Nam", textBox1.Text); 
     cmd.Parameters.AddWithValue(@"add", textBox2.Text); 
     cmd.Parameters.AddWithValue(@"phone",textBox3.Text); 

     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     MessageBox.Show("entered"); 
    } 
} 

但是,即使輸入值後代碼是正確的,表中也沒有任何內容存儲。

+1

那是什麼問號而不是Insert語句中的有效參數? –

+0

代表三個文本框字段的標記... 我已經嘗試過使用@,但無濟於事。 –

+0

查看此鏈接http://www.mikesdotnetting.com/Article/26/Parameter-Queries-in-ASP .NET-MS-Access –

回答

1

當我有類似的問題,解決辦法是:

如果數據庫是它可以在一個文件夾bin複製應用程序的一部分 - 然後用它的應用程序的工作。這就是爲什麼你無法使用MS Access客戶端查找數據表的更改。

+0

我的項目在主項目文件夾中有一個dx數據庫以及BIN文件夾。 如果我刪除後者,我的問題會解決嗎? –

+0

如果您刪除'bin'文件夾中的數據庫,它將在您的下一次構建中被簡單地複製,而不進行更改。您需要在解決方案資源管理器中選擇數據庫,然後查看「複製到輸出目錄」的屬性,該目錄應設置爲「不要複製」。然後,您需要連接到項目文件夾中的數據庫,這意味着您不能使用'| DataDirectory |',而是數據庫的絕對路徑。 –

+0

這有點解決了我的問題,但出現了一個新問題,(我把同一個數據庫放在d盤並建立連接)。 如果我想讓這個代碼在多個系統上工作。它會起作用嗎?現在,該數據庫不在輸出目錄..我將不得不手動添加數據庫到其他機器D驅動器? 還是有工作? –

2

不應該

cmd.Parameters.AddWithValue(@"Nam", textBox1.Text);

要:

cmd.Parameters.AddWithValue("@Nam", textBox1.Text);

等等其他參數?

+0

嘗試過,不工作... 所有的數據同時輸入,但是當我刷新表時沒有數據可見...... –

+0

不,「@」foo「'表示」逐字串「,而」@foo「表示包含T-SQL參數的常規字符串。由於不需要逐字字符串(因爲沒有轉義序列),並且還因爲他沒有使用T-SQL,因此可以從OP的代碼中完全省略「@」。 – Dai

1

確保您的數據庫存在於輸出(bin)文件夾中,其中存在項目的exe文件。如果沒有,然後複製它。將您的database文件放在正確的位置後,您將看到更改。

此外,您還需要對代碼進行一些更改,但您的參數存在問題。 將Values (?,?,?)改爲Values (@Nam,@add,@phone)";@"Nam"改爲"@Nam"。見評論Correction1 and Correction2

也沒有必要使用雙斜線\\當你在字符串的開頭使用@

string [email protected]"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\dxs.accdb"); 

string sql="Insert Into tests([Nam],[add],[phone]) Values (@Nam,@add,@phone)"; 
// Correction 1: Above line is changed ?,?,? to parameter names (names used by your command) 

using (OleDbConnection conn = new OleDbConnection(ConnString)) 
{ 
    using (OleDbCommand cmd = new OleDbCommand(sql, conn)) 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.Parameters.AddWithValue("@Nam", textBox1.Text); 
     cmd.Parameters.AddWithValue("@add", textBox2.Text); 
     cmd.Parameters.AddWithValue("@phone",textBox3.Text); 
     // Correction 2: your parameter names are changed @"xyz" to "@xyz" 

     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     MessageBox.Show("entered"); 
    } 
} 
+0

downvote是不需要的;這似乎是解決方案。 '| DataDirectory |'引用輸出文件夾中的數據庫,而不是項目文件夾中的數據庫。 –

+0

@ZevSpitz。我感謝你的投票。但我不明白(沒有關於)輸出文件夾。我並沒有如你所說那樣想,但我準備好想,如果我有點想法 – Sami

+0

我說** downvote不是要求** - 不應該有downvote,因爲這似乎是答案。 (downvote不是我的。)但是,你可以編輯這個參數,像原始問題一樣,以避免SQL注入。 –

-1

insert語句應該像DIS

string SqlString = "Insert Into tests([Nam], [add], [phone]) Values (@Nam, @add, @phone)"; 


    cmd.CommandType = CommandType.Text; 
    cmd.Parameters.AddWithValue("@Nam", textBox1.Text); 
    cmd.Parameters.AddWithValue("@add", textBox2.Text); 
    cmd.Parameters.AddWithValue("@phone",textBox3.Text); 

試試這個

+0

downvote - [The .NET Framework Data Provider對於OLE DB和.NET Framework ODBC數據提供程序不支持將參數傳遞給SQL語句或存儲過程的命名參數。](http://msdn.microsoft.com/zh-cn/library/yy6y35y8.aspx) 。 –