如何使用C#语言在数据库中插入记录?

时间:2012-08-27 13:20:57

标签: c# database visual-studio-2008

我只是C#的初学者,所以我需要太多的帮助。现在的问题是我设计了一个窗口表单,其中有许多字段,如名字,姓氏,地址等。现在我想要做的是,当我填写表单并单击插入按钮时,所有信息都进入数据库。有谁知道怎么做?

private void button1_Click(object sender, System.EventArgs e)
{
    string connetionString = null;
    SqlConnection cnn ;
    SqlDataAdapter adapter = new SqlDataAdapter();
    string sql = null;
    connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;

    cnn = new SqlConnection(connetionString);
    sql = "insert into Main (Firt Name, Last Name) values(textbox2.Text,textbox3.Text)";

    try
    {
        cnn.Open();
        adapter.InsertCommand = new SqlCommand(sql, cnn);
        adapter.InsertCommand.ExecuteNonQuery();
         MessageBox.Show ("Row inserted !! ");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

6 个答案:

答案 0 :(得分:17)

您的查询中存在许多问题 这是代码的修改版本

string connetionString = null;
string sql = null;
connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;
using(SqlConnection cnn = new SqlConnection(connetionString))
{
   sql = "insert into Main ([Firt Name], [Last Name]) values(@first,@last)";
   cnn.Open();
   using(SqlCommand cmd = new SqlCommand(sql, cnn))
   {
       cmd.Parameters.AddWithValue("@first", textbox2.text);
       cmd.Parameters.AddWithValue("@last", textbox3.text);
       cmd.ExecuteNonQuery();
       MessageBox.Show ("Row inserted !! ");
   }
}
  • 列名包含空格(这应该避免),因此您 需要方括号围绕它们
  • 您需要使用using语句来确保连接 将被关闭并释放资源
  • 您将控件直接放在字符串中,但这不起作用
  • 您需要使用参数化查询来避免引用问题和 sqlinjiection攻击
  • 无需使用DataAdapter进行简单的插入查询

除此之外,还有其他潜在的问题。如果用户没有在文本框控件中输入任何内容,该怎么办?在尝试插入之前,您是否对此进行了任何检查? 正如我所说,字段名称包含空格,这将导致代码不便。尝试更改这些字段名称。

编辑:如果您正在使用.NET Framework 1.1,那么您没有AddWithValue方法,因此请使用这些

更改两个AddWithValue行
   cmd.Parameters.Add("@first", SqlDbType.NVarChar).Value = textbox2.text;
   cmd.Parameters.Add("@last", SqlDbType.NVarChar).Value = textbox3.text;

此代码假定您的数据库列的类型为NVARCHAR,否则,请使用相应的SqlDbType枚举值。

请计划尽快切换到更新版本的.NET Framework 1.1现在已经过时了。

答案 1 :(得分:4)

使用参数化查询来防止Sql注入(安全问题)

使用using语句,以便关闭连接并处理资源。

using(var connection = new SqlConnection("connectionString"))
{
    connection.Open();
    var sql = "INSERT INTO Main(FirstName, SecondName) VALUES(@FirstName, @SecondName)";
    using(var cmd = new SqlCommand(sql, connection))
    {
        cmd.Parameters.AddWithValue("@FirstName", txFirstName.Text);
        cmd.Parameters.AddWithValue("@SecondName", txSecondName.Text);

        cmd.ExecuteNonQuery();
    }
}

答案 2 :(得分:4)

您应该更改代码以使用SqlParameters并使您的insert语句适应以下

string connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;
// [ ] required as your fields contain spaces!!
string insStmt = "insert into Main ([First Name], [Last Name]) values (@firstName,@lastName)";

using (SqlConnection cnn = new SqlConnection(connetionString))
{
    cnn.Open();
    SqlCommand insCmd = new SqlCommand(insStmt, cnn);
    // use sqlParameters to prevent sql injection!
    insCmd.Parameters.AddWithValue("@firstName", textbox2.Text);
    insCmd.Parameters.AddWithValue("@lastName", textbox3.Text);
    int affectedRows = insCmd.ExecuteNonQuery();
    MessageBox.Show (affectedRows + " rows inserted!");
}

答案 3 :(得分:0)

您应该使用文本框的内容形成命令:

sql = "insert into Main (Firt Name, Last Name) values(" + textbox2.Text + "," + textbox3.Text+ ")";

当然,这可以让您设法正确打开连接。

知道当前代码发生了什么会很有帮助。如果您在该消息框中显示一些错误,那么知道它的含义会很棒。

您还应该在实际运行命令之前验证输入(即确保它们不包含恶意代码......)。

答案 4 :(得分:0)

sql = "insert into Main (Firt Name, Last Name) values(textbox2.Text,textbox3.Text)";

(Firt Name)不是有效字段。它应该是FirstName或First_Name。这可能是你的问题。

答案 5 :(得分:0)

您应该使用文本框的内容来构成命令:

sql = "insert into Main (Firt Name, Last Name) values(" + textbox2.Text + 
"," + textbox3.Text+ ")";

当然,前提是您设法正确打开连接。

了解当前代码正在发生的事情会很有帮助。如果您在该消息框中显示了一些错误,那么很高兴知道它在说什么。

您还应该在实际运行命令之前验证输入(即确保输入不包含恶意代码)。