作为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
)中的文本插入名为beforebath1
的数据库beforebath_db.mdf
的表中。
是否与我的数据目录有关?
答案 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();
}