2012-03-25 125 views
2

所以当我的表单加载时,它会连接到数据库,当我点击按钮时,它会插入一个新行到我的数据库,但我后我点击它,我没有看到我的表中有任何更改。无法在C#sql数据库中插入数据

namespace database 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     SqlConnection con; 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      con = new SqlConnection(); 
      con.ConnectionString = 
       "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True"; 
      con.Open(); 
      MessageBox.Show("OPEN!"); 
     } 

     private void label1_Click(object sender, EventArgs e) 
     { 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      int x; 
      SqlCommand thiscommand = con.CreateCommand(); 
      thiscommand.CommandText = 
       "INSERT INTO player_info (player_id, player_name) values (10, 'Alex') "; 

      x = thiscommand.ExecuteNonQuery(); /* I used variable x to verify 
                that how many rows are 
                affect, and the return is 1. 
                The problem is that I don't 
                see any changes in my table*/ 
      MessageBox.Show(x.ToString()); 
      con.Close(); 
     } 
    } 
} 
+0

你用什么来检查记录是否被插入? SQL Server管理工作室? – 2012-03-25 20:12:28

+0

您是否将用户名和密码留下来发布问题,或者他们不在代码中? – mowwwalker 2012-03-25 20:14:29

+3

你为什么要在Form_Load中打开连接?打开,使用并关闭(可能需要处理)需要它们的连接。 – 2012-03-25 20:14:41

回答

9

您正在使用附加的Db文件。这意味着Project-build会在Bin文件夹中创建一个副本,并且您正在处理2个不同版本的Db。您可能正在检查原件。

这实际上可能相当有用(每次都新鲜复制)。如果不是,请更改Db文件的Copy-when属性。

+1

+1不知道如果*那*是实际问题,但好点:) – Tigran 2012-03-25 20:14:34

+0

谢谢你的时间。 那么正确或更有效的方法是什么? 因为它好像我插入成功,但我没有查看正确的数据库文件, 我应该上传数据库在线? 对不起,我是新手。 – 2012-03-25 23:12:54

+0

您可以在程序本身查看结果,限制复制或(有时)将bin \ debug文件夹中的版本复制到项目根目录。 – 2012-03-26 18:56:41

1

没有足够的细节来确切地知道为什么值没有显示在您的数据库中,但我建议您更改您的编码练习(如下所述),重新测试,然后尽可能详细地提供关于事情失败的地方。

编码实践

你打开你的连接要早于需要(这意味着你保持一种宝贵的资源超过所需的时间),你不清理连接或命令。他们实现了IDisposable,所以你必须调用Dispose()。最简单的方法是使用using声明。

建议重写:

// Remove initialization of the SqlConnection in the form load event. 

private void button1_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection con = new SqlConnection()) 
    { 
     con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True"; 
     con.Open(); 
     // Optional: MessageBox.Show("OPEN!"); 
     int x; 
     using (SqlCommand thiscommand = con.CreateCommand()) 
     { 
      thiscommand.CommandText = "INSERT INTO player_info (player_id, player_name) values (10, 'Alex') "; 

      x = thiscommand.ExecuteNonQuery();  /*I used variable x to verify that how many rows are affect, and the return is 1. The problem is that i dont see any changes in my table*/ 
      // Optional: MessageBox.Show(x.ToString()); 
     } 
    } 
} 
+0

同意使用'',但也从配置中获取ConnString。 – 2012-03-25 20:23:07

+0

'IDisposableS'应该(不一定)被处置,并且你关闭连接与using语句是多余的(dispose会隐式关闭它)。 +1无论如何 – 2012-03-25 20:26:34

+0

@Tim:同意不重复地调用con.Close()(更新的答案)。你评论的第一部分是什么意思? – 2012-03-25 20:39:50

0

ExecuteNonQuery方法进行说明在MSDN如下:

 
Executes a Transact-SQL statement against the connection and returns 
the number of rows affected.

如果你1作为返回值,一个记录必须被插入。

忘记了查询表格吗?新记录不会在您的应用程序中自动显示。

+0

谢谢你的时间。 – 2012-03-25 23:14:18

+0

那么,如果我的应用程序中不会自动显示新记录,我该如何检查查询是否有效。 有没有更好的方法呢?像使用在线数据库或SQL管理工作室? 对不起,我对这个 – 2012-03-25 23:15:33

+0

NVM是全新的,我发现使用mysql比sqlserver更容易。 问题解决了,感谢大家的帮助。 – 2012-03-25 23:32:40

0

您可以考虑运行SQL Profiler来查看实际发送到数据库的内容。您可以捕获SQL,然后尝试直接对数据库执行该代码。

“player_id”意味着这是一个主键,如果是这种情况插入会失败。

我还建议像其他人一样,改变你的方式,以“使用”的风格,因为这将为你管理你的资源,并确保你不会离开连接“徘徊”。