我有一个应该打开,编辑,创建和保存访问数据库的程序。为了保存,我只使用表复制一个空数据库(只是为了避免经历创建每个表和列等的麻烦)并尝试通过TableAdapterManager.UpdateAll方法用值填充它。
string _TemplateConnectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};";
_connection = new OleDbConnection(string.Format(_TemplateConnectString, dlg.FileName));
_connection.Open();
DataSet1TableAdapters.TableAdapterManager tam=new TableAdapterManager();
tam.Connection = _connection;
try
{
tam.UpdateAll(dataset);
}
catch (System.Exception ex)
{
MessageBox.Show("Update failed");
}
它完成没有例外,但值不会插入到新数据库中。
另据我所知,UpdateAll方法只更新修改后的行,所以如果我打开一些数据库并插入行,即使数据库中没有我要填充的内容也不会考虑它们。
我还尝试使用ADODB和ADOX扩展来填充数据库,但我发现的所有解决方案都是大量的硬编码,而不考虑层次结构,密钥等。
有没有办法强制在新数据库中插入所有内容?
答案 0 :(得分:0)
您的模板数据库是否在Visual Studio项目目录中?它可能与Visual Studio将数据库复制到bin / debug或bin / release文件夹...
有关答案 1 :(得分:0)
尝试使用正确的数据源数据库名称,此处为 excel文件的示例:
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\somepath\ExcelFile.xls;" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"";"
答案 2 :(得分:0)
笨拙的解决方案,但它的工作原理。我迭代数据集的表并保存通过一个sql字符串生成器,如下所示:
void SaveTable(DataTable dt)
{
string[] inserts;
try
{
inserts = SqlHelper.GenerateInserts(dt, null, null, null);
foreach (string s in inserts)
{
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = s;
cmd.Connection = _connection;
int n = cmd.ExecuteNonQuery();
}
}
catch (Exception e)
{
SaveOk = false;
}
}
我在这个网站的某个地方找到了SqlHelper,但是完全丢失了,不幸的是。所以这里是带有https://pastebin.com/iCMVuYyu
的pastebin