【问题标题】:Data is not inserting into table?数据没有插入到表中?
【发布时间】:2012-02-21 18:07:42
【问题描述】:

我的表名是Customer。它有四列

CustomerId
CustomerName
CustomerAddress
PhoneNo

这是我的 C# 代码。我没有收到任何异常,并且数据没有插入到数据库中。

string connString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\VictoryDatabase.mdf;Integrated Security=True;User Instance=True";
SqlConnection myConnection = new SqlConnection(connString);

try
{
   myConnection.Open();
   string query = "insert into Customer(CustomerName,CustomerAddress,PhoneNo) values (@CustNm,'@CustAdd',@Ph)";
   SqlCommand myCommand = new SqlCommand(query,myConnection);
   myCommand.Parameters.AddWithValue("CustNm",Print[0].CustomerName);
   myCommand.Parameters.AddWithValue("CustAdd",Print[0].Address);
   myCommand.Parameters.AddWithValue("Ph",Print[0].Telephone);

   Console.WriteLine(Print[0].Telephone);

   myCommand.ExecuteNonQuery();
   myConnection.Close();
}
catch (Exception e)
{
   Console.WriteLine(e.ToString());
}

【问题讨论】:

  • 为了澄清......您根本没有插入任何行,还是插入了一个空白行?
  • ExecuteNonQuery 返回什么?
  • 正如我之前在此站点上所说的那样 - 整个 User Instance 和 AttachDbFileName= 方法是有缺陷的 - 充其量! Visual Studio 将在 .mdf 文件周围进行复制,很可能,您的 INSERT 工作正常 - 但您最终只是查看了 错误的 MDF 文件!如果你想坚持下去 - 尝试在你的连接上的 .Close() 调用上放置一个断点 - 然后检查 .mdf 文件,例如SQL Server Mgmt Studio Express - 我几乎可以肯定你的数据在那里。
  • 真正的解决方案是 (1) 安装 SQL Server Express,(2) 安装 SQL Server Management Studio Express,(3) 在 SSMS 中创建数据库 Express,并且 (4) 使用它的逻辑 数据库名称 连接到它(在服务器上创建它时给出) - 不要弄乱物理数据库文件和用户实例和所有这些废话!
  • 是的,我不明白使用这个 AttachDbFilename 和 User Instance 废话的愿望。这不是每次构建/编译/调试时都会创建一个新版本的 MDF 吗?

标签: c# sql-server sql-server-2005


【解决方案1】:

正如我之前在本网站上所说的那样 - 整个 User Instance 和 AttachDbFileName= 方法是有缺陷的 - 充其量是! Visual Studio 将复制 .mdf 文件,很可能,您的 INSERT 工作正常 - 但您只是在查看 错误的 .mdf 文件结束!

如果您想坚持使用这种方法,请尝试在 myConnection.Close() 调用上设置断点 - 然后使用 SQL Server Mgmt Studio Express 检查 .mdf 文件 - 我几乎可以确定您的数据在那里。

在我看来,真正的解决方案

  1. 安装 SQL Server Express(反正你已经完成了)

  2. 安装 SQL Server Management Studio Express

  3. SSMS Express中创建你的数据库,给它一个逻辑名称(例如VictoryDatabase

  4. 使用它的逻辑数据库名称(在服务器上创建它时给出)连接到它——不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.\\SQLEXPRESS;Database=VictoryDatabase;Integrated Security=True
    

    其他一切都一模一样和以前一样......

【讨论】:

  • +100 - 一定有一个教程描述了这种“用户实例”方法,并且在细则中说“PS 不要使用这个。”
  • @AaronBertrand:是的,很可能 - 还没有找到它,虽然(在浩瀚的 MSDN 文档海......)
  • 但是我已经在visualstudio名称victorydatabase中创建了8个表数据库,是否可以移植到`SQL Server Management Studio Express`
  • @Hira:是的! - 您只需启动 SSMS Express,将您的 .mdf 文件放在正确的位置(其他 .mdf 文件所在的位置),然后你可以附加那个 MDF 文件,你就完成了!
  • @marc_s 感谢您的回答,对我帮助很大,现在一切正常,感谢您的帮助。
【解决方案2】:

你所说的根本不会发生。查询将插入一条记录,否则您将收到异常。

不过,您的查询中有错误。 @CustAdd 参数周围不应有撇号,这会使数据库将其解释为文字字符串,而不是参数:

string query = "insert into Customer(CustomerName,CustomerAddress,PhoneNo) values (@CustNm,@CustAdd,@Ph)";

我不确定数据库会如何反应,但你会得到一个异常,告诉你有一个从未在查询中使用过的参数,或者它会插入一条值为 @CustAdd 的记录作为地址。

【讨论】:

    【解决方案3】:
    1. 您确定您正在查看正确的数据库以验证没有 正在插入数据?
    2. 您是否在 未提交的事务的上下文?

    【讨论】:

      【解决方案4】:

      您没有指定相同的参数,(忘记添加“@”这样做:

      string query = "insert into Customer(CustomerName,CustomerAddress,PhoneNo) values (@CustNm,'@CustAdd',@Ph)";
              SqlCommand myCommand = new SqlCommand(query,myConnection);
              myCommand.Parameters.AddWithValue("@CustNm",Print[0].CustomerName);
              myCommand.Parameters.AddWithValue("@CustAdd",Print[0].Address);
              myCommand.Parameters.AddWithValue("@Ph",Print[0].Telephone);
      

      【讨论】:

        【解决方案5】:

        是否将 CustomerId 设置为 Customer 表上的 AutoIncrementing PK?此外,您不需要在 '@CustAdd' 参数上使用单引号 (');

        【讨论】:

          猜你喜欢
          • 2020-08-26
          • 1970-01-01
          • 1970-01-01
          • 2013-06-22
          • 2015-01-11
          • 1970-01-01
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多