2016-06-09 16 views
-2

我試圖做一個簡單的C#windows應用程序作爲初學者。但我得到一個System.Data.SqlClient.SqlException。當我嘗試連接到數據庫時,它說連接正常。但它不允許我使用visual studio創建任何表格。我不明白爲什麼它不顯示添加新表的選項。 這是我的代碼。C#sql相關異常

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace best 
{ 
    public partial class Form1 : Form 
    { 

     SqlConnection con=new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Janith Kularathne\Documents\testing.mdf; 
     Integrated Security=True;Connect Timeout=30"); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void insertB_Click(object sender, EventArgs e) 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "Insert into details values('"+ idBox.Text +"', '"+ nameBox.Text + "')"; 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     idBox.Text = ""; 
     nameBox.Text=""; 
     DisplayDetails(); 
     MessageBox.Show("Insertion succesfull");   
    } 

    private void deleteB_Click(object sender, EventArgs e) 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "Delete from details where id= '" + idBox.Text + "')"; 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     idBox.Text = ""; 
     nameBox.Text = ""; 
     DisplayDetails(); 
     MessageBox.Show("delete succesfull"); 
    } 

    private void updateB_Click(object sender, EventArgs e) 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "update details set id, name,category where id= '" + idBox.Text + "')"; 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     idBox.Text = ""; 
     nameBox.Text = ""; 
     DisplayDetails(); 
     MessageBox.Show("Update succesfull"); 
    } 

    private void searchB_Click(object sender, EventArgs e) 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "selet *from details where id= '" + idBox.Text + "')"; 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     DisplayDetails(); 
    } 

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     DisplayDetails(); 
    } 

    public void DisplayDetails() 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "select * from details"; 
     cmd.ExecuteNonQuery(); 
     DataTable dt = new DataTable(); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(dt); 
     dataGridView1.DataSource = dt; 

     con.Close(); 
    } 
} 
+1

會發生什麼事; Drop table細節; '進入'idBox'? –

回答

6

你的代碼目前包含了各種不同的問題,我將詳細一點上,應該解決一些當前的問題:

  • 不必要的右括號
  • 拼寫錯誤和拼寫錯誤
  • 語法錯誤
  • 使用參數

除此之外,我強烈建議閱讀一些使用不同方法的教程,例如使用ExecuteNonQuery(),ExecuteReader()ExecuteNonScalar()等不同方法來確定在執行查詢時如何實際檢索查詢中的值。

不必要的右括號

您現在有一個尾隨關閉您SELECTUPDATEDELETE查詢中內每個查詢的括號這很可能導致一個語法錯誤:

// Notice the unnecessary trailing ')', which should only be useful within your INSERT call 
cmd.CommandText = "..." + idBox.Text + "')"; 

錯別字和拼寫錯誤

附加類型PO是您的搜索查詢以及單詞「選擇」中存在拼寫錯誤:

// "selet" should be "Select" 
cmd.CommandText = "selet *from details where id= '" + idBox.Text + "')"; 

語法錯誤

您當前UPDATE查詢不會實際上似乎做任何事情。您正在使用SET關鍵字,但不是實際的值設置爲任何事情:

// UPDATE queries should be in the form UPDATE {table} SET {Column} = {Value} WHERE ... 
cmd.CommandText = "update details set id, name,category where id= '" + idBox.Text + "')"; 

參數,不串聯

此外,你真的應該考慮建立查詢使用時參數。它可以幫助避免SQL注入等不良情況,並防止語法錯誤。

你可以看到的是什麼,這可能看起來像是爲你的方法下面一個例子:當我輸入'0'

private void searchB_Click(object sender, EventArgs e) 
{ 
    con.Open(); 
    var query = "SELECT * FROM details WHERE ID = @id"; 
    using(var cmd = new SqlCommand(query, connection)) 
    { 
     cmd.Parameters.AddWithValue("@id",idBox.Text); 
     using(var reader = cmd.ExecuteReader()) 
     { 
       // Access your results here and do something with them 
     } 
    } 
} 
+1

難道你不應該將帖子標記爲offtopic,並強制用戶做出自己的作業,而不是爲他提供這些錯誤的答案嗎? –

+0

公平點。但是,如果這是OP的工作,那麼他/她顯然試圖實施這些並遇到各種類型的錯誤。我只是在談論一些做錯的事情,以及如何糾正這些事情。 –

+0

由於這是使用傳遞查詢,我建議不要使用AddWithValue。它有時可能會導致數據類型錯誤。在這種情況下最好使用明確的類型參數。 http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ –