本地数据库不会更新,也不会显示错误

时间:2012-11-25 06:57:04

标签: c# .net winforms dataset sql-server-ce

嘿,我是新手,从我设法拿到的应该可行,但它不会更新我的本地数据库。

我创建了我的本地数据库时自动生成了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();
}

4 个答案:

答案 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()