0

嘿,我是新手,从我设法获得的内容来看,这应该可以工作,但它不会更新我的本地数据库。

我有一个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 caller - 被调用的 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

4 回答 4

0

Fill() 方法“添加或刷新 DataSet 中的行以匹配数据源中的行”。这句话的关键部分是“匹配数据源中的那些”。当您调用 Fill() 时,您添加的行将被清除,因为它尚未在源中。

我不是很肯定,但如果您只是添加新记录而不担心修改/删除现有记录,我认为您甚至不需要调用 Fill()。但是,如果您确实需要调用它,则显然需要在您进行任何新记录插入之前将其移动。

于 2012-11-25T07:14:01.240 回答
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

于 2012-11-25T07:25:02.817 回答
0

好吧,最后我没有设法解决这个问题,而是我使用了远程数据库和常规 sql 命令。

感谢那些帮助过的人!

于 2012-11-25T09:09:35.550 回答
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:/..projectname/bin”

然后再次使用它

Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory())) 将为您提供项目文件夹“C:/..projectname”中根数据库的位置

然后只需使用 AppDomain.CurrentDomain.SetData()

于 2014-04-30T08:13:26.270 回答