无法在数据库中创建新记录;无错误信息
本文关键字:新记录 无错误 信息 创建 数据库 | 更新日期: 2023-09-27 18:15:15
我试图添加新的记录到trans_daily
表,然而,下面的代码片段执行按钮单击不起作用。
问题代码
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);
}
}
数据类型如下:
- retail_id (int)
- 价格(浮动)
- date (datetime)
- visibility (int)
- remarks_id (int)
还值得指出的是,正在抛出no异常。
哪里出了问题?
工作代码
在一个单独的函数中,我能够在表单加载时从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";
}
试试这段代码,你可能会发现你的错误:
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);
}
此代码将…
…自动打开和关闭数据库连接和命令对象
…将数据库中受影响的行数量记录到控制台
…将异常消息记录到控制台。如果您想看到整个异常(如果发生了),可以在该行添加一个断点
正如本博客所解释的,问题似乎出在连接字符串上。
在项目文件夹中,创建了2个.mdf
文件:一个在文件夹的根目录(我们称之为mdf_1
),另一个在bin'Debug
文件夹(我们称之为mdf_2
)。
现在,看看Visual Studio (VS)编辑器内部,显示了2个.mdf
文件:一个在服务器资源管理器下,另一个在解决方案资源管理器下。没有注意到这些.mdf
文件的位置(从属性部分)使我认为这2个.mdf
文件是相同的。问题是,服务器资源管理器下的是mdf_1
,而解决方案资源管理器下的是mdf_2
。
VS有一个行为,每次程序运行时复制mdf_1
并覆盖mdf_2
(因为默认情况下,.mdf
被设置为Copy always mdf_1
到mdf_2
)。我的连接字符串指向mdf_2
,这解释了为什么尽管cmd.ExecuteNonQuery()
命令返回1,但由于VS的行为,我成功插入的记录总是被擦除。因为它是mdf_1
是在服务器资源管理器下,我无法验证DB的变化。简单地说,我在mdf_2
中进行更改,同时试图查找mdf_1
中的更改。
因此,为了避免这种情况,我通过将连接字符串中的相对路径|DataDirectory|
更改为mdf_1
的绝对路径来修改我的连接字符串,这样无论VS覆盖mdf_2
的频率有多高,我在mdf_1
运行时所做的更改都不会被覆盖。也就是说,更改也会反映在服务器资源管理器中(我在这里验证是否实际进行了更改)。
tl;dr:我在运行时更新bin'Debug
文件夹下的.mdf
文件,而物理地寻找位于项目根目录下的.mdf
文件中的更新。