嘿,我是新手,从我设法拿到的应该可行,但它不会更新我的本地数据库。
我创建了我的本地数据库时自动生成了TelemarketingDatabaseDataSet
,然后我将表格拖到数据集上,我猜他们已经链接了。
现在我有了这段代码:
SqlCeConnection connection = new SqlCeConnection();
connection.ConnectionString = TelemarketingTracker.Properties.Settings.Default.TelemarketingDatabaseConnectionString;
TelemarketingDatabaseDataSet ds = new TelemarketingDatabaseDataSet();
// DataTable tbl = new DataTable();
SqlCeDataAdapter adapter = new SqlCeDataAdapter("select * from Calls", connection);
//adapter.InsertCommand = new SqlCeCommand("InsertQuery", connection);
adapter.Fill(ds,"Calls");
DataTable tbl = ds.Tables["Calls"];
//tbl.Columns.Add("caller");
//tbl.Columns.Add("called");
//tbl.Columns.Add("duration");
//tbl.Columns.Add("time");
var row = tbl.NewRow();
row[1] = Convert.ToString(caller);
row[2] = Convert.ToString(called);
row[3] = Convert.ToString(duration);
row[4] = Convert.ToDateTime(time);
tbl.Rows.Add(row);
adapter.Update(ds, "Calls");
connection.Close();
MessageBox.Show("Database should be updated!");
请问,我不喜欢使用SqlCommand,因为我更喜欢使用DataSet。
问题可能与我的表的数据类型有关吗?它没有显示错误,但我想这可能是问题所在。我的表包括:
ID - int,key 来电者 - varchar 名为 - varchar 持续时间 - varchar 时间 - 日期时间
修改
现在,如果我取消注释insertQuery行,我会在Syste.Data dll中出现未处理的错误。
现在,即使我尝试使用常规插入命令,我也没有错误,但数据库不会更新。 如果在关闭调试窗口后这会产生任何差异,我会看到本地数据库旁边的X,但它没有显示任何错误。
这是我试过的命令:
using (SqlCeCommand com = new SqlCeCommand("INSERT INTO Calls (caller, called, duration, time) Values(@Caller,@Called,@Duration,@Time)", connection))
{
com.Parameters.AddWithValue("@Caller", row[1]);
com.Parameters.AddWithValue("@Called", row[2]);
com.Parameters.AddWithValue("@Duration", row[3]);
com.Parameters.AddWithValue("@Time", row[4]);
com.ExecuteNonQuery();
}
答案 0 :(得分:0)
Fill()方法“添加或刷新DataSet中的行以匹配数据源中的行。”这句话的关键部分是“匹配数据源中的那些”。当您调用Fill()时,您添加的行将被删除,因为它不在源中。
我不是肯定的,但如果您只是添加新记录而不担心修改/删除现有记录,我不会认为您甚至需要调用Fill()。如果你确实需要调用它,显然需要在你进行任何新记录插入之前移动它。
答案 1 :(得分:0)
尝试类似的东西..
string dbfile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + "\\TelemarketingDatabase.sdf";
SqlCeConnection connection = new SqlCeConnection("datasource=" + dbfile);
TelemarketingDatabaseDataSet ds = new TelemarketingDatabaseDataSet();
SqlCeDataAdapter adapter = new SqlCeDataAdapter();
string qry = @"select * from Calls";
da.SelectCommand = new SqlCommand(qry, connection);
SqlCommandBuilder cb = new SqlCommandBuilder(adapter);
adapter.Fill(ds,"Calls");
DataTable tbl = ds.Tables["Calls"];
var row = tbl.NewRow();
row[0] = caller;
row[1] = called;
row[2] = duration;
row[3] = Convert.ToDateTime(time);
tbl.Rows.Add(row);
adapter.Update(ds,"Calls");
请参阅此处的示例http://www.java2s.com/Code/CSharp/Database-ADO.net/UseDataTabletoupdatetableinDatabase.htm
答案 2 :(得分:0)
最后我没有设法解决这个问题,而是使用了远程数据库和常规的sql命令。
感谢那些帮助过的人!
答案 3 :(得分:0)
如果问题陈旧,只想分享这个
using System;
using System.IO; //needed for path.getdirectoryname() and directory.getcurrentdirectory()
string path = Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory()));
AppDomain.CurrentDomain.SetData("DataDirectory", path);
Directory.GetcurrentDirectory()将输出“C:/ .. projectname / bin / debug”,这是临时database.mdf所在的位置
通过使用Path.GetDirectoryName(Directory.GetcurrentDirectory()),它将给出当前目录的目录,从而将一个位置移回 “C:/ ..项目名称/ BIN”
然后再次使用
Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory()))将为您提供项目文件夹中根数据库的位置 “C:/ ..项目名称”
然后只使用AppDomain.CurrentDomain.SetData()