【问题标题】:insert data in table在表中插入数据
【发布时间】:2013-11-14 07:57:33
【问题描述】:

当我插入数据时,我可以在 DATAGRIDVIEW 中读取它们,但是从数据库资源管理器中读取 Table1 时,我无法在 Table1 中找到存储的数据,此外,之后我会丢失 DATAGRIDVIEW 的数据。

将数据发送到数据库是否正确?

conn.ConnectionString =
   "Persist Security Info = False; Data Source = 'table1.sdf';" +
   "Password = '....'; File Mode = 'shared read'; " +
   "Max Database Size = 256; Max Buffer Size = 1024";

conn.Open();
SqlCeCommand cmd = new SqlCeCommand("INSERT INTO Tp_Inr_Dosage (date, Tp, Inr, LastDosage, NewDosage, pathology_level,  Pathology, idpatient) values( '" + DateTime.Now.ToString() + "', " + tpTextBox.Text.Replace(",", ".") + ", " + inrTextBox.Text.Replace(",", ".") + " ," + lastDosageTextBox.Text.Replace(",", ".") + ", " + newDosageTextBox.Text.Replace(",", ".") + " ," + pathologyComboBox.SelectedIndex + " , '" + pathologyComboBox.SelectedItem + "', '" + patient + "' )", conn);

cmd.ExecuteNonQuery();
conn.Close();

就像我的数据只进入缓冲区,它永远不会到达数据库

【问题讨论】:

  • 是否有任何异常/错误消息?这也许是非常常见的“我正在查看 /MyProject/table1.sdf 而不是 /MyProject/bin/debug/table1.sdf?不相关:你不应该像那样连接 SQL - 你 真的需要用到参数
  • 嗨,没有错误,代码运行良好,我只是在数据库中找不到我的数据。在数据库资源管理器中打开表后,我丢失了 datgridview 中的所有数据
  • 你真的想不出比这更好的标题了吗?能更具体地描述您的问题吗?
  • @boularouk 以及您在数据库资源管理器中查看的究竟是哪个文件?您项目中的数据库文件不是您的应用使用的数据库文件...
  • 我打开C#的数据库浏览器,点击表格浏览数据。

标签: c# sql datagridview


【解决方案1】:

在 IDE 中,项目结构中可能有一个数据库文件(sdf、mdf 或类似文件);也许在MyProject\table1.sdf,或者也许在MyProject\Data\table1.sdf。当您使用 IDE 工具查看数据库时,这是您正在查看的文件

但是,当您构建项目时,项目文件会被写入(复制)到构建位置 - 类似于:

  • MyProject\bin\debug\table1.sdf
  • MyProject\bin\debug\Data\table1.sdf
  • MyProject\bin\release\table1.sdf
  • MyProject\bin\release\Data\table1.sdf

当您的应用程序运行时,它正在编辑构建位置中的文件。您对数据所做的任何更改仅在文件的此副本中可见。所以:如果您使用任何数据库查看工具,您需要绝对确定您正在查看构建位置中的文件,而不是原始项目位置中的文件。

【讨论】:

  • 好的,我的表位于根 MyProject\table1.sdf 中。但是为什么之后我在 datagridview 中找不到我的数据。
  • @boularouk 无法在不知道您如何填充该 datagridview 以及 何时 获取该数据的情况下发表评论。但是:app 没有查看 MyProject\table1.sdf - 它正在查看 MyProject\bin\debug\table1.sdf
【解决方案2】:

更优雅的插入方式是:

string query = "INSERT INTO Tp_Inr_Dosage (date, Tp, Inr, LastDosage, NewDosage, pathology_level,  Pathology, idpatient) VALUES (@date, @Tp, @InRowChangingEventException, @LastDosage, @NewDosage, @pathology_level, @Pathology, @idpatient)";

SqlCeCommand cmd = new SqlCeCommand(query);

cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue(new SqlParameter("@date", DateTime.Now));
cmd.Parameters.AddWithValue(new SqlParameter("@Tp", string.Empty));
cmd.Parameters.AddWithValue(new SqlParameter("@InRowChangingEventException", string.Empty));
// etc.

cmd.ExecuteNonQuery();

【讨论】:

  • 你不需要CommandType.Text。默认为Text
  • 回应对一个非常相似(现已删除)的答案的评论:“这并不能真正回答他的问题,因为使用字符串连接不是他问题的根源。是的,他应该使用参数,但这是一个不同的问题。” - 使用参数的指导是一个很好的想法,但不太可能与实际问题相关
  • 我想是的,这不是问题
【解决方案3】:

我发现 sqlCommands 往往会默默地失败:将进程封装在一个通用的 try/catch 块中,以查看它未能正确执行的操作。比如:

try
{
    conn.Open();
    SqlCeCommand cmd = new SqlCeCommand(ParameterisedSQlQueryText, conn);
    //Put your parameters in here
    cmd.ExecuteNonQuery();
}
catch (Exception ex) {MessageBox.Show(ex.Message);}
finally {conn.Close();}

前消息通常是在这些情况下出现问题的良好指标。

【讨论】:

  • 它默默地失败了,然后根据定义它不是抛出;如果它在投掷,OP 很可能会注意到
  • 一般来说,但我遇到了这些问题(尽管使用 OleDBCommands)它不会抛出,但如果我尝试/捕捉它会告诉我出了什么问题。不,我不知道为什么。
  • 嗯,我怀疑数据根本没有像问题中的 cmets 所建议的那样到达您认为的位置。
  • 是的,这就像它去缓冲区或虚拟位置一个tableadapter?。
  • 不,它将转到 sdf 文件的副本,这与您使用数据库资源管理器查看的文件不同。尝试硬编码 ConnectionString 以指向某处的固定文件,而不是项目结构中的相对文件,然后使用您必须查看的任何内容 that sdf
猜你喜欢
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2017-03-17
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多