将语句插入SQL Server数据库
本文关键字:Server 数据库 SQL 插入 语句 | 更新日期: 2023-09-27 17:59:24
过去几天我一直在努力寻找这个bug,但没有成功。
我正试图在数据库中插入一个新行。一切都很顺利:没有错误,也没有程序崩溃。
我的INSERT
语句如下:
INSERT INTO Polozaj(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek)
VALUES(1,1,1,1,1,1)
该语句是可以的,因为当我在数据库中运行查询时,它会添加新行。
我的C#代码如下:
string connection = @"Data Source=(LocalDB)'v11.0;AttachDbFilename=" + Application.StartupPath + "''Trgovina.mdf;Integrated Security=True";
SqlConnection cn = new SqlConnection(connection);
string payment = ((Button)sender).Text, maxID = string.Empty;
double discount = Convert.ToDouble(discauntText.Text), totalPrice = Convert.ToDouble(fullPriceText.Text), fullPrice = Convert.ToDouble(discountPriceText.Text);
switch (payment)
{
case "Dobavnica": discount = 10; break;
case "Kartica": discount = 0; break;
case "Gotovina": discount = 5; break;
}
cn.Open();
SqlCommand maxIdCmd = new SqlCommand("SELECT MAX(Id_racuna) FROM Racun", cn);
maxID = Convert.ToString(maxIdCmd.ExecuteScalar());
maxID = maxID != "" ? Convert.ToString(Convert.ToInt32(maxID) + 1) : "1";
string stmt = "INSERT INTO Racun(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek) " +
"VALUES(@Price, @User, @Time, @Customer, @Discount, @FullPrice)";
SqlCommand cmd = new SqlCommand(stmt, cn);
cmd.ExecuteNonQuery();
cn.Close();
正如我已经提到的,看起来程序运行这个查询,一切都很正常,但当我查看表Racun
时,没有新行。此外,当我尝试刷新这个表时,visualstudio(2012)给了我一个错误,看起来像:This database cannot be imported. It is either unsupported SQL Server version or an unsupported database compatibility.
我的表Racun
创建查询如下所示:
CREATE TABLE [dbo].[Racun] (
[Id_racuna] INT IDENTITY (1, 1) NOT NULL,
[Znesek] NUMERIC (10, 3) NULL,
[Uporabnik] NCHAR (20) NULL,
[Cas] NCHAR (15) NULL,
[Kupec] NCHAR (10) NULL,
[Popust] NUMERIC (10, 3) NULL,
[Poln_znesek] NUMERIC (10, 3) NULL,
PRIMARY KEY CLUSTERED ([Id_racuna] ASC)
);
我不知道出了什么问题。有人能帮忙吗?
这样的插入有三种可能的情况:
- 插入成功
- 你会得到一个例外
- 您有一个触发器,可以用其他操作替换插入
我想你没有触发器,而且由于表中没有记录,所以一定会有一个例外。
您是否有任何代码可以在任何其他级别捕获异常?这可以解释为什么你看不到它,也可以解释为什么数据库连接没有关闭,这可以解释你之后连接到数据库时遇到问题。
对数据库连接使用using
块可以正确地关闭它,即使代码中有错误。
您使用的是参数化查询,但我看不出您在代码中的任何位置都将参数添加到命令对象中。这将类似于:
cmd.Parameters.Add("Price", SqlDbType.Decimal).Value = price;
cmd.Parameters.Add("User", SqlDbType.NChar, 20).Value = user;
cmd.Parameters.Add("Time", SqlDbType.NChar, 15).Value = time;
cmd.Parameters.Add("Customer", SqlDbType.NChar, 10).Value = customer;
cmd.Parameters.Add("Discount", SqlDbType.Decimal).Value = discount;
cmd.Parameters.Add("FullPrice", SqlDbType.Decimal).Value = fullPrice;
我会尝试将您的代码包装在try
块中,看看是否可以捕获SqlExecption
:
try {
SqlCommand cmd = new SqlCommand(stmt, cn);
cmd.ExecuteNonQuery();
} catch (SqlException ex) {
Console.WriteLine(ex.Message);
}
编辑:看起来您缺少INSERT
语句的参数,您可能应该考虑使用SqlTransaction
:
SqlCommand maxIdCmd = new SqlCommand("SELECT MAX(Id_racuna) FROM Racun", cn);
maxID = Convert.ToString(maxIdCmd.ExecuteScalar());
maxID = maxID != "" ? Convert.ToString(Convert.ToInt32(maxID) + 1) : "1";
string stmt = "INSERT INTO Racun(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek) " +
"VALUES(@Price, @User, @Time, @Customer, @Discount, @FullPrice)";
SqlCommand cmd = new SqlCommand(stmt, cn);
// Adding parameters to the insert statement:
cmd.Parameters.AddWithValue("@Price", price);
cmd.Parameters.AddWithValue("@User", user);
cmd.Parameters.AddWithValue("@Time", time);
cmd.Parameters.AddWithValue("@Customer", customer);
cmd.Parameters.AddWithValue("@Discount", discount);
cmd.Parameters.AddWithValue("@FullPrice", fullprice);
// Start a transaction so we can roll back if there's an error:
SqlTransaction transaction = cn.BeginTransaction();
cmd.Transaction = transaction;
try {
cmd.ExecuteNonQuery();
transaction.Commit();
} catch (SqlException ex) {
transaction.Rollback();
Console.WriteLine(ex.Message);
} finally {
cn.Close();
}