2016-06-09 68 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/ –