Sql server 回滚并在sql事务中出现错误时通知
具有通过Sql server 回滚并在sql事务中出现错误时通知,sql-server,winforms,Sql Server,Winforms,具有通过SqlTransaction在windows窗体中执行事务的代码,并将数据库加载到表中。如果有错误,只需在MessageBox.Show(例如Message)中输出。但是,现在有必要以过程的形式在数据库的服务器端处理数据。但是,如果应用程序中的事务中的数据不正确,我如何通知用户 ALTER PROCEDURE [dbo].[addPacient] @name NVARCHAR(20), @surname NVARCHAR(20), @middle NVARCHAR
SqlTransaction
在windows窗体中执行事务的代码,并将数据库加载到表中。如果有错误,只需在MessageBox.Show(例如Message)中输出代码>。但是,现在有必要以过程的形式在数据库的服务器端处理数据。但是,如果应用程序中的事务中的数据不正确,我如何通知用户
ALTER PROCEDURE [dbo].[addPacient]
@name NVARCHAR(20),
@surname NVARCHAR(20),
@middle NVARCHAR(20),
@passport NCHAR(10),
@address NVARCHAR(20),
@age INT,
@name_diagnoz NVARCHAR(30),
@stage CHAR(1)
AS
BEGIN TRAN
BEGIN TRY
INSERT INTO Pacient(Name, Surname, Middle_name, Column__Passport,
Legal_address_Clinic, Age, id_diagnoz)
VALUES (@name, @surname, @middle, @passport,
@address, @age,
(SELECT id_diagnoz FROM Diagnoz
WHERE Name_diagnoz = @name_diagnoz and Stage = @stage))
END TRY
BEGIN CATCH
ROLLBACK TRAN
RETURN
END CATCH
COMMIT TRAN
如何称呼它:
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand("addPacient", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@name", txtName.Text);
command.Parameters.AddWithValue("@surname", txtSurname.Text);
command.Parameters.AddWithValue("@middle", txtMiddle.Text);
command.Parameters.AddWithValue("@passport", mskPassport.Text);
command.Parameters.AddWithValue("@address", cbAddres.Text);
command.Parameters.AddWithValue("@age", cbAge.Text);
command.Parameters.AddWithValue("@name_diagnoz", cbxNameDiagnoz.Text);
command.Parameters.AddWithValue("@stage", cbxStage.Text);
connection.Open();
using (SqlDataReader dr = command.ExecuteReader())
{
while (dr.Read())
{
int intColumn = dr.GetInt32(dr.GetOrdinal("intColumnName"));
string stringColumn = dr.GetString(dr.GetOrdinal("stringColumnName"));
}
}
}
在当前代码中不需要明确的事务;默认情况下,单语句自动提交事务将提供所有none并引发错误。在这种情况下,T-SQL TRY/CATCH不提供值,因此您可以简单地使用:
ALTER PROCEDURE [dbo].[addPacient]
@name NVARCHAR(20),
@surname NVARCHAR(20),
@middle NVARCHAR(20),
@passport NCHAR(10),
@address NVARCHAR(20),
@age INT,
@name_diagnoz NVARCHAR(30),
@stage CHAR(1)
AS
INSERT INTO Pacient(Name, Surname, Middle_name, Column__Passport,
Legal_address_Clinic, Age, id_diagnoz)
VALUES (@name, @surname, @middle, @passport,
@address, @age,
(SELECT id_diagnoz FROM Diagnoz
WHERE Name_diagnoz = @name_diagnoz and Stage = @stage));
GO
如果有多条语句在explict T-SQL事务中执行数据修改,请确保在过程代码中包含SET XACT_ABORT ON
,以确保在客户端超时(CATCH块将不执行)时自动回滚事务。我建议在多语句过程中使用这种错误处理模式:
ALTER PROCEDURE [dbo].[addPacient]
@name NVARCHAR(20),
@surname NVARCHAR(20),
@middle NVARCHAR(20),
@passport NCHAR(10),
@address NVARCHAR(20),
@age INT,
@name_diagnoz NVARCHAR(30),
@stage CHAR(1)
AS
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRAN;
INSERT INTO Pacient(Name, Surname, Middle_name, Column__Passport,
Legal_address_Clinic, Age, id_diagnoz)
VALUES (@name, @surname, @middle, @passport,
@address, @age,
(SELECT id_diagnoz FROM Diagnoz
WHERE Name_diagnoz = @name_diagnoz and Stage = @stage));
--other data modification statements
COMMIT;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END CATCH;
GO
此外,最好避免AddWithValue
并传递强类型参数。这将提高服务器端和服务器端的缓存重用
有多少次你必须被告知不要使用?读完一篇文章后,我说这是最后一次使用AddWidthValue
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand("addPacient", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = txtName.Text;
command.Parameters.Add("@surname", SqlDbType.NVarChar, 20).Value = txtSurname.Text;
command.Parameters.Add("@middle", SqlDbType.NVarChar, 20).Value = txtMiddle.Text;
command.Parameters.Add("@passport", SqlDbType.NChar, 10).Value = mskPassport.Text;
command.Parameters.Add("@address", SqlDbType.NVarChar, 20).Value = cbAddres.Text;
command.Parameters.Add("@age", SqlDbType.Int, 20).Value = int.Parse(cbAge.Text);
command.Parameters.Add("@name_diagnoz", SqlDbType.NVarChar, 30).Value = cbxNameDiagnoz.Text;
command.Parameters.Add("@stage", SqlDbType.Char, 1).Value = cbxStage.Text;
connection.Open();
using (SqlDataReader dr = command.ExecuteReader())
{
while (dr.Read())
{
int intColumn = dr.GetInt32(dr.GetOrdinal("intColumnName"));
string stringColumn = dr.GetString(dr.GetOrdinal("stringColumnName"));
}
}
}
}
catch (Exception ex)
{
MessageGox.Show(ex.Message);
}