无法在visual c#中将数据添加到数据库中

时间:2014-08-15 19:30:18

标签: c# sql sql-server database

作为c#的初学者,我花了很多时间研究这个: 我无法将一些数据添加到数据库中,我可以从中提取数据,但无法在数据库中添加任何内容。我使用sql server作为我的数据库。

try {    
    fname = fname_tb.Text;// first name
    sname = sname_tb.Text; // second name
    q = "insert into beforebath1(firstname,secondname) values(@fname,@sname)";
    conn_string = Properties.Settings.Default.beforebath_connection_string;
    SqlConnection co = new SqlConnection(conn_string);
    SqlCommand cmd;

    co.Open();
    cmd = new SqlCommand(q, co);
    cmd.Connection = co;
    cmd.Parameters.AddWithValue("@fname", fname_tb.Text);
    cmd.Parameters.AddWithValue("@sname", sname_tb.Text);
    cmd.ExecuteNonQuery();
    co.Close();  
}
catch(Exception err) {
    MessageBox.Show(err.toString());   
}

我的sql连接字符串是这样的:

Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\beforebath_db.mdf;Integrated Security=True;Connect Timeout=30

我在创建数据库时自动生成。请帮助我将两个文本框(fname_tb.Textsname_tb.Text)中的文本插入名为beforebath1的数据库beforebath_db.mdf的表中。

是否与我的数据目录有关?

3 个答案:

答案 0 :(得分:1)

我在你的代码中看到了一些错误。

首先,为什么要捕获只会在消息中显示的异常?

通常最好让异常冒泡,以便在调试中获得堆栈跟踪。如果这是生产代码,这是不一样的,我怀疑。

其次,请务必妥善处理您的物品。

Using Statement是使用可处置项目(例如数据库连接和命令)的最佳方式。

using (var cnx = new SqlConnection(connectionString)) {
    cnx.Open();

    var sql = @"insert into beforebath1 (first_name, second_name)
                values (@fname, @lname)";

    using (var cmd = new SqlCommand(sql, cnx)) {
        cmd.Parameters.AddWithValue("@fname", fname_tb.Text);
        cmd.Parameters.AddWithValue("@lname", lname_tb.Text);

        try {
            int rowsAffected = cmd.ExecuteNonQuery();
            if (0 < rowsAffected) MessageBox.Show("Success!");
            else MessageBox.Show("Failed!");
        } catch (SqlException ex) {
            // It is almost prefered to let the exception be thrown freely
            // so that you may have its full stack trace and have more 
            // details on your error.
            MessageBox.Show(ex.Message);
        } finally {
            if (cnx.State == ConnectionState.Open) cnx.Close();
        }
    }
}

这样,将您的一次性对象包裹在using块中,您可以确保在退出代码块时所有内容都会自动处理。

至于你的“它不起作用”问题,我想这个问题可能是在连接字符串级别,也可能是table_name级别。

您希望插入beforebath1,并且您的插入语句指出table_name。确保将正确的表名放在它所属的位置,以便它可以正常工作。

答案 1 :(得分:0)

您可以将连接字符串更改为:

Server=(LocalDB)\v11.0;Database=beforebath_db;Trusted_Connection=True;

这意味着您的应用和使用Db的其他程序将共享同一个实例。

另外,正如@Will所提到的,你应该将SQLConnection包装在一个用于垃圾收集的using语句中。

答案 2 :(得分:0)

为了更好的实现,您可以使用bellow:

之类的stored_procedures

步骤1:为您的查询声明存储过程:

CREATE PROCEDURE [dbo].[ADD_TO_BEFORE_PATH_SP]
    /*Type of this variables should be their column types*/
    @fname varchar(MAX),
    @lname varchar(MAX)
AS
BEGIN
    INSERT INTO [dbo].[beforebath1] (fname, lname)
           VALUES (@fname,@lname)
END 

步骤2:在您需要的地方使用存储过程:

SqlConnection con = new SqlConnection(connectionString);
SqlCommand com = new SqlCommand("ADD_TO_BEFORE_PATH_SP", con);
com.Parameters.AddWithValue("@fname", fname_tb.Text);
com.Parameters.AddWithValue("@lname", lname_tb.Text);
com.CommandType = CommandType.StoredProcedure;
try
{
    con.Open();
    com.ExecuteNonQuery();
}
catch (Exception)
{
    throw;
}
finally
{
    if (con.State == ConnectionState.Open)
        con.Close();
}