不能在visual c#中向数据库中添加数据

本文关键字:数据库 添加 数据 不能 visual | 更新日期: 2023-09-27 18:18:07

作为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)中的文本插入到数据库beforebath_db.mdf的表beforebath1中。

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

不能在visual c#中向数据库中添加数据

我发现你的代码中有几个错误。

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

通常最好让异常冒泡,以便在调试中进行堆栈跟踪。如果这是生产代码,这就不一样了,我对此表示怀疑。

第二,确保充分地处置你的对象。

Using语句是处理可丢弃项(如数据库连接和命令)的最佳方式。
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。请确保将正确的表名放在它所属的位置,以便它可以正常工作。

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

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

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

另外,正如@Will所提到的,您应该将SQLConnection包装在using语句中,以便进行垃圾收集。

为了更好的实现,您可以像下面这样使用stored_procedures:

Step1:为查询声明存储过程:

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();
}