我正在编写 ac# 程序并使用 SQL Server 作为数据库。
我正在运行一个INSERT, SELECT, 并UPDATE紧随其后。前两个语句运行正常,但最后一个UPDATE语句将运行一次,但当它第二次运行时,它将冻结程序并在 30 秒左右后出现此错误:
System.Data.SqlClient.SqlException:'执行超时已过期。在操作完成之前超时时间已过或服务器没有响应。
该语句已终止。
内部异常
Win32Exception:等待操作超时
这是我的连接字符串:
private const string constr = @"Data Source=MSI\SQLEXPRESS;Initial Catalog=DatabaseHuskyCenter;Integrated Security=True ;MultipleActiveResultSets=True";
这是库存表:
USE [DatabaseHuskyCenter]
GO
/****** Object: Table [dbo].[Inventory] Script Date: 12/21/2020 20:07:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Inventory](
[IDinventory] [nvarchar](50) NOT NULL,
[IDitem] [nvarchar](50) NULL,
[quantity] [int] NULL,
CONSTRAINT [PK_Inventory] PRIMARY KEY CLUSTERED
(
[IDinventory] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Inventory] WITH CHECK ADD CONSTRAINT [FK_Inventory_Items] FOREIGN KEY([IDitem])
REFERENCES [dbo].[Items] ([IDitem])
GO
ALTER TABLE [dbo].[Inventory] CHECK CONSTRAINT [FK_Inventory_Items]
GO
这是我运行三个查询的应用程序代码:
int quan = 1;
int m=0;
string tag = ((PictureBox)sender).Tag.ToString();
sqlcon = new Connection();
sqlcon.cmd = new SqlCommand("select * from Inventory,Items where Inventory.IDitem = Items.IDitem and Items.IDitem like '" + tag + "'", sqlcon.con);
sqlcon.dr = sqlcon.cmd.ExecuteReader();
sqlcon.dr.Read();
if (sqlcon.dr.HasRows)
{
sqlcon.cmd = new SqlCommand("INSERT INTO SellActions(ID,IDsell,IDitem,IDuser,buyerName,[Date],quantityyy,[index])values(@id,@idsell,@iditem,@iduser,@buyer,@date,@quan,@index)", sqlcon.con);
sqlcon.cmd.Parameters.AddWithValue("@id", sqlcon.SellActionCode());
sqlcon.cmd.Parameters.AddWithValue("@idsell",codeTxt.Text);
sqlcon.cmd.Parameters.AddWithValue("@iditem", tag);
sqlcon.cmd.Parameters.AddWithValue("@iduser", sqlcon.getUserID());
sqlcon.cmd.Parameters.AddWithValue("@buyer", nameTxt.Text);
sqlcon.cmd.Parameters.AddWithValue("@date", dateandtime.Dateshort());
sqlcon.cmd.Parameters.AddWithValue("@quan", quan);
sqlcon.cmd.Parameters.AddWithValue("@index", index++);
try
{
sqlcon.cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK);
throw;
}
sqlcon.cmd.Dispose();
SqlCommand find = new SqlCommand("select quantity from Inventory where IDitem = '" + tag+ "'", sqlcon.con);
try
{
sqlcon.dr = find.ExecuteReader();
while (sqlcon.dr.Read())
{
m =sqlcon.dr.GetInt32(0);
}
sqlcon.dr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw;
}
find.Dispose();
sqlcon.dr.Close();
m -= quan;
MessageBox.Show(m.ToString());
if (sqlcon.con.State == ConnectionState.Closed)
{
sqlcon.con.Open();
}
sqlcon.cmd = new SqlCommand("update Inventory set quantity=@quantity where IDitem = @tag", sqlcon.con);
sqlcon.cmd.Parameters.AddWithValue("@tag", tag.ToString());
sqlcon.cmd.Parameters.AddWithValue("@quantity", m.ToString());
try
{
sqlcon.cmd.ExecuteNonQuery();
sqlcon.cmd.Dispose();
sqlcon.con.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK);
throw;
}
Clear();
getData();
}
sqlcon.dr.Close();
ItemLimit++;
它相当混乱,对此感到抱歉,但问题发生在这里
if (sqlcon.con.State == ConnectionState.Closed)
{
sqlcon.con.Open();
}
sqlcon.cmd = new SqlCommand("update Inventory set quantity=@quantity where IDitem = @tag", sqlcon.con);
sqlcon.cmd.Parameters.AddWithValue("@tag", tag.ToString());
sqlcon.cmd.Parameters.AddWithValue("@quantity", m.ToString());
try
{
sqlcon.cmd.ExecuteNonQuery();
sqlcon.cmd.Dispose();
sqlcon.con.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK);
throw;
}
这是错误的图像:
