【问题标题】:Cannot create new record to the database; no error message无法在数据库中创建新记录;没有错误信息
【发布时间】:2016-10-29 00:37:27
【问题描述】:

我正在尝试将新记录添加到trans_daily 表中,但是,单击按钮时执行的下面的代码 sn-p 不起作用。

问题代码

    private void button1_Click(object sender, EventArgs e)
    {
     try
     {
        SqlConnection connection = new SqlConnection(conString);
        connection.Open();

        string strcom = "INSERT INTO trans_daily (retail_id, cust_name, quantity, " +
        "price, date, visibility, remarks_id) VALUES (@RetailID, @CustomerName, " +
        "@Quantity, @Price, @Date, @Visibility, @RemarksID)";

        SqlCommand cmd = new SqlCommand(strcom, connection);
        cmd.Parameters.AddWithValue("@RetailID", ddRetailType.SelectedValue);
        cmd.Parameters.AddWithValue("@CustomerName", tbCustomer.Text);
        cmd.Parameters.AddWithValue("@Quantity", float.Parse(tbQuantity.Text));
        cmd.Parameters.AddWithValue("@Price", float.Parse(tbPrice.Text));
        cmd.Parameters.AddWithValue("@Date", DateTime.Now);
        cmd.Parameters.AddWithValue("@Visibility", 1);
        cmd.Parameters.AddWithValue("@RemarksID", 1);
        cmd.ExecuteNonQuery();
     }
     catch (Exception err)
     {
        Console.WriteLine(err.Message);
     }
  }

以下是数据类型:

  1. retail_id (int)
  2. cust_name (varchar50)
  3. 数量(浮点数)
  4. 价格(浮动)
  5. 日期(日期时间)
  6. 可见性 (int)
  7. remarks_id (int)

还值得指出的是,没有异常被抛出。

可能出了什么问题?


工作代码
在一个单独的函数中,我能够在表单加载时从retail 表中提取数据,并将提取的数据放置到下拉列表中。

    private void formAddTransaction_Load(object sender, EventArgs e)
    {
        try
        {
            objConnect = new DatabaseConnection();
            conString = Properties.Settings.Default.MVGasConnectionString;
            objConnect.Sql = "SELECT * FROM retail";
            objConnect.connection_string = conString;
            ds = objConnect.GetConnection;

            MaxRows = ds.Tables[0].Rows.Count;
            FillRetailTypes(conString);
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message);
        }
    }

    public void FillRetailTypes(string constring)
    {
        ddRetailType.DataSource = ds.Tables[0];
        ddRetailType.ValueMember = "id";
        ddRetailType.DisplayMember = "type";
    }

【问题讨论】:

  • 这取决于异常消息的内容。让我们深入研究您的异常并尝试找出可能出了什么问题。如果您不能将其添加到您的问题中,我们会为您提供帮助。
  • 除了您的错误,您是否关闭了连接?
  • 嗨托尔加。单击按钮后,没有显示异常消息。我什至不知道函数内部的代码是否被执行。
  • ExecuteNonQuery 返回什么? 0 还是 1?
  • 在您的点击事件处理程序的第一行放置一个断点并测试是否执行了此行

标签: c# sql


【解决方案1】:

试试这个代码,你可能会发现你的错误:

try
{
    using(SqlConnection connection = new SqlConnection(conString))
    using(SqlCommand cmd = new SqlCommand())
    {
        connection.Open();
        string strcom = "INSERT INTO trans_daily ([retail_id], [cust_name], [quantity], " +
    "[price], [date], [visibility], [remarks_id]) VALUES (@RetailID, @CustomerName, " +
    "@Quantity, @Price, @Date, @Visibility, @RemarksID)";

        cmd.CommandText = strcom;
        cmd.Connection = connection;
        cmd.Parameters.AddWithValue("@RetailID", SqlDbType.Int);
        cmd.Parameter["@RetailID"].Value = ddRetailType.SelectedValue;
        cmd.Parameters.AddWithValue("@CustomerName", SqlDbType.VarChar);
        cmd.Parameter["@CustomerName"].Value = tbCustomer.Text;
        cmd.Parameters.AddWithValue("@Quantity", SqlDbType.Float);
        cmd.Parameter["@Quantity"].Value = float.Parse(tbQuantity.Text);
        cmd.Parameters.AddWithValue("@Price", SqlDbType.Float);
        cmd.Paramter["@Price"].Value = float.Parse(tbPrice.Text);
        cmd.Parameters.AddWithValue("@Date", SqlDbType.DateTime);
        cmd.Parameter["@Date"].Value = DateTime.Now;
        cmd.Parameters.AddWithValue("@Visibility", SqlDbType.Int);
        cmd.Parameter["@Visibility"].Value = 1;
        cmd.Parameters.AddWithValue("@RemarksID", SqlDbType.Int);
        cmd.Parameter["@RemarksID"].Value = 1;
        int affectedRows = cmd.ExecuteNonQuery();
        Console.WriteLine("You have inserted {0} rows", affectedRows);
    }
}
catch(Exception e)
{
    Console.WriteLine(e.Message);
}

此代码将...

  • ...自动打开和关闭您的数据库连接和命令对象

  • ...将数据库中受影响的行数记录到控制台

  • ... 将异常消息记录到控制台。如果您想查看整个异常(如果发生),可以在该行添加断点

【讨论】:

  • 因为正如 OP 所说,没有抛出异常,try-catch 部分没有增加任何价值。此外,这不是问题的解决方案,它只是试图在不解决问题的情况下“捕捉”错误
  • 目前,我不想用这段代码修复任何问题。我只是想找到一种方法来了解他的代码有什么问题......
  • 因此,我写的是“试试这个代码,你可能会发现你的错误:”而不是“使用这个,这就是解决方案”
  • 嗨@Jules。谢谢你。我尝试将代码 sn-ps 插入到我的代码中,但它在控制台中返回“您已插入 1 行”。但是在查看之后,我的表中并没有真正添加任何内容。 :(
  • @kulit, retail_id 是您表的主键,不是吗?是自增设计还是自己选ID?
【解决方案2】:

正如this blog 中所述,问题似乎出在连接字符串中。

在项目文件夹中,创建了2个.mdf文件:一个位于文件夹的根目录(我们称之为mdf_1),另一个在bin\Debug文件夹内(我们称之为mdf_2 )。

现在,查看 Visual Studio (VS) 编辑器内部,显示了 2 个.mdf 文件:一个位于服务器资源管理器下,另一个位于解决方案资源管理器下。没有注意到这些.mdf 文件的位置(来自属性部分)让我认为这两个.mdf 文件是相同的。问题是,服务器资源管理器下的那个是mdf_1,而mdf_2 是解决方案资源管理器下的那个。

VS 具有复制mdf_1 并在每次程序运行时覆盖mdf_2 的行为(因为默认情况下,.mdf 设置为始终复制mdf_1mdf_2) .我的连接字符串指向mdf_2,这解释了为什么尽管cmd.ExecuteNonQuery() 命令返回1,但由于VS 的行为,我成功插入的记录总是被删除。由于服务器资源管理器下是mdf_1,因此我无法验证数据库中的更改。简而言之,我在尝试查找 mdf_1 中的更改时,正在对 mdf_2 进行更改。

所以为了避免这种情况,我修改了我的连接字符串,将连接字符串中的相对路径 |DataDirectory| 更改为 mdf_1 的绝对路径,这样无论 VS 多久覆盖 mdf_2,我在mdf_1 中的运行时不会被覆盖。也就是说,更改也反映在服务器资源管理器中(我验证是否实际进行了更改)。


tl;dr:我在运行时更新了bin\Debug 文件夹下的.mdf 文件,同时物理地在位于项目根目录的.mdf 文件中查找更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多