今天在用C#写一个winform程序时,要向数据库Sql server2005 中插入数据,
程序提示成功,但打开数据库却没有值,再次执行时,提示主键重复,可是
数据库中并没有数据啊
原来的代码为
string sql = @"Data Source=.;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"; using (SqlConnection con = new SqlConnection(sql)) { con.Open(); using(SqlCommand cmd=con.CreateCommand()) { cmd.CommandText = "insert into tb_test(ID,Name,Age) values('wang1','haha',123)"; cmd.ExecuteNonQuery(); } }
后来发现除了项目中有个 Database1.mdf 以外,在bin/Debug/下也有一个 Database1.mdf 。
经查阅资料得知,当使用相对路径时,程序把数据库文件复制到了 bin/Debug/ 下面了,也就是说
当插入数据时,实际上是向Debug下面数据库插入文件,而不是在根目录下的数据库,所以无论怎么插入
在根目录下的数据库中根本没有数据,同时,多次插入还会导致主键重复。
所以在调试程序时,应使用绝对路径,等发布程序时再改回。因为程序启动路径是“../bin/Debug”,而我们实际的数据库却在外面。
在这个问题中还可以这样:
private void button1_Click(object sender, EventArgs e) { string dataDir = AppDomain.CurrentDomain.BaseDirectory; if (dataDir.EndsWith(@"bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")) { dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName; AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); } string sql = @"Data Source=.;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"; using (SqlConnection con = new SqlConnection(sql)) { con.Open(); using(SqlCommand cmd=con.CreateCommand()) { cmd.CommandText = "insert into tb_test(ID,Name,Age) values('wang1','haha',123)"; cmd.ExecuteNonQuery(); } } }