我尝试将新记录添加到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
表中提取数据,并将提取的数据放到下拉列表中。
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";
}
答案 0 :(得分:0)
尝试使用此代码,您可能会发现错误:
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);
}
此代码将......
...自动打开和关闭数据库连接和命令对象
...将数据库中受影响的行数记录到控制台
...将异常消息记录到控制台。如果要查看整个异常(如果发生),可以在此行中添加断点
答案 1 :(得分:0)
如this blog中所述,似乎问题出在连接字符串中。
在项目文件夹中,创建了2个.mdf
个文件:一个位于文件夹的根目录(让我们称之为mdf_1
),另一个位于bin\Debug
文件夹内(我们称之为mdf_2
)。
现在,在Visual Studio(VS)编辑器中查看,显示了2个.mdf
个文件:一个在Server Explorer下,另一个在Solution Explorer下。没有注意到这些.mdf
文件的位置(来自属性部分)让我觉得这两个.mdf
文件是相同的。问题是,Server Explorer下的那个是mdf_1
,而mdf_2
是解决方案资源管理器下的那个。
VS的行为会在每次运行程序时复制mdf_1
并覆盖mdf_2
(因为默认情况下,.mdf
设置为始终复制 {{ 1}}到mdf_1
)。我的连接字符串指向mdf_2
,这解释了为什么尽管mdf_2
命令返回1,但由于VS具有的行为,我的成功插入记录总是被删除。由于它是cmd.ExecuteNonQuery()
在服务器资源管理器下,我无法验证数据库中的更改。简而言之,我正在mdf_1
中进行更改,同时尝试在mdf_2
中查找更改。
为了避免这种情况,我通过将连接字符串中的相对路径mdf_1
更改为|DataDirectory|
的绝对路径来修改我的连接字符串,这样无论VS覆盖mdf_1
的频率如何,我在mdf_2
运行时期间所做的更改不会被覆盖。也就是说,更改也反映在服务器资源管理器中(我在其中验证是否实际进行了更改)。
tl; dr :我在运行时期间更新mdf_1
文件夹下的.mdf
文件,同时在bin\Debug
文件中查找更新项目的根源。