不能在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.Text
和sname_tb.Text
)中的文本插入到数据库beforebath_db.mdf
的表beforebath1
中。
是否与我的数据目录有关?
我发现你的代码中有几个错误。
首先,为什么要捕获只在消息中显示的异常?
通常最好让异常冒泡,以便在调试中进行堆栈跟踪。如果这是生产代码,这就不一样了,我对此表示怀疑。
第二,确保充分地处置你的对象。
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();
}