【发布时间】:2016-08-31 17:50:03
【问题描述】:
我会尽量做到具体一点。
我正在将 CSV 文件读入DataGridView,如果用户验证信息,用户可以看到该信息,他发送到 SQL Server 数据库。
我正在使用带有参数的存储过程事务来发送信息。
从 Visual Studio 调用:
using (SqlConnection conn = new SqlConnection(CadenaConexionBD.cs)) {
conn.Open();
for (int i = 0; i < dgvTrabajadores.Rows.Count - 1; i++){
using (SqlCommand cmd = new SqlCommand("SistemaFAIFAP.cargaTransTrabajadores", conn)){
cmd.CommandType = CommandType.StoredProcedure;
guid = Guid.NewGuid();
string stringGuid = guid.ToString();
cmd.Parameters.AddWithValue("@id", stringGuid);
cmd.Parameters.AddWithValue("@ap", dgvTrabajadores.Rows[i].Cells["APELLIDOPATERNO"].Value.ToString());
cmd.Parameters.AddWithValue("@am", dgvTrabajadores.Rows[i].Cells["APELLIDOMATERNO"].Value.ToString());
cmd.Parameters.AddWithValue("@n", dgvTrabajadores.Rows[i].Cells["NOMBRE"].Value.ToString());
cmd.Parameters.AddWithValue("@fn", DateTime.Parse(dgvTrabajadores.Rows[i].Cells["FECHANACIMIENTO"].Value.ToString()));
cmd.Parameters.AddWithValue("@pn", dgvTrabajadores.Rows[i].Cells["PAISNACIMIENTO"].Value.ToString());
cmd.Parameters.AddWithValue("@en", dgvTrabajadores.Rows[i].Cells["ENTIDADNACIMIENTO"].Value.ToString());
cmd.Parameters.AddWithValue("@nn", dgvTrabajadores.Rows[i].Cells["NombreNacionalidad"].Value.ToString());
cmd.Parameters.AddWithValue("@nss", dgvTrabajadores.Rows[i].Cells["NSS"].Value.ToString());
cmd.Parameters.AddWithValue("@rfc", dgvTrabajadores.Rows[i].Cells["RFC"].Value.ToString());
cmd.Parameters.AddWithValue("@hom", dgvTrabajadores.Rows[i].Cells["HOMONIMIA"].Value.ToString());
cmd.Parameters.AddWithValue("@curp", dgvTrabajadores.Rows[i].Cells["CURP"].Value.ToString());
cmd.Parameters.AddWithValue("@ec", dgvTrabajadores.Rows[i].Cells["ESTADOCIVIL"].Value.ToString());
cmd.Parameters.AddWithValue("@sex", dgvTrabajadores.Rows[i].Cells["SEXO"].Value.ToString());
cmd.Parameters.AddWithValue("@ce", dgvTrabajadores.Rows[i].Cells["CORREOELECTRONICO"].Value.ToString());
cmd.Parameters.AddWithValue("@cat", dgvTrabajadores.Rows[i].Cells["CATEGORIA"].Value.ToString());
cmd.Parameters.AddWithValue("@dc", dgvTrabajadores.Rows[i].Cells["DESCRIPCIONCATEGORIA"].Value.ToString());
cmd.Parameters.AddWithValue("@calle", dgvTrabajadores.Rows[i].Cells["CALLE"].Value.ToString());
cmd.Parameters.AddWithValue("@num", dgvTrabajadores.Rows[i].Cells["NUMEROEXTERIOR"].Value.ToString());
cmd.Parameters.AddWithValue("@col", dgvTrabajadores.Rows[i].Cells["COLONIA"].Value.ToString());
cmd.Parameters.AddWithValue("@mun", dgvTrabajadores.Rows[i].Cells["MUNICIPIO"].Value.ToString());
cmd.Parameters.AddWithValue("@ent", dgvTrabajadores.Rows[i].Cells["ENTIDAD"].Value.ToString());
cmd.Parameters.AddWithValue("@tel", dgvTrabajadores.Rows[i].Cells["TELEFONO"].Value.ToString());
cmd.Parameters.AddWithValue("@dep", dgvTrabajadores.Rows[i].Cells["DEPENDENCIA"].Value.ToString());
cmd.Parameters.AddWithValue("@subdep", dgvTrabajadores.Rows[i].Cells["SUBDEPENDENCIA"].Value.ToString());
cmd.Parameters.AddWithValue("@dir", dgvTrabajadores.Rows[i].Cells["DIRECCION"].Value.ToString());
cmd.Parameters.AddWithValue("@depa", dgvTrabajadores.Rows[i].Cells["DEPARTAMENTO"].Value.ToString());
cmd.Parameters.AddWithValue("@ofi", dgvTrabajadores.Rows[i].Cells["OFICINA"].Value.ToString());
cmd.Parameters.AddWithValue("@npl", dgvTrabajadores.Rows[i].Cells["NUMEROPLAZA"].Value.ToString());
cmd.Parameters.AddWithValue("@cvep", dgvTrabajadores.Rows[i].Cells["CLAVEPROGRAMATICA"].Value.ToString());
cmd.Parameters.AddWithValue("@fig", DateTime.Parse(dgvTrabajadores.Rows[i].Cells["FECHAINGRESOGOBIERNO"].Value.ToString()));
cmd.Parameters.AddWithValue("@nc", dgvTrabajadores.Rows[i].Cells["NUMEROCONTROL"].Value.ToString());
cmd.Parameters.AddWithValue("@cvee", dgvTrabajadores.Rows[i].Cells["CLAVEEMPLEADO"].Value.ToString());
cmd.Parameters.AddWithValue("@ior", dgvTrabajadores.Rows[i].Cells["IDOFICINARECAUDADORA"].Value.ToString());
cmd.Parameters.AddWithValue("@fum", DateTime.Parse(dgvTrabajadores.Rows[i].Cells["FECULTMOV"].Value.ToString()));
filasAfectadas = cmd.ExecuteNonQuery();
}
}
if (filasAfectadas <= 0){
MessageBox.Show("Los datos no se cargaron de manera correcta. \nContacte al Administrador del Sistema.", "Error al cargar la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error);
conn.Close();
}else{
MessageBox.Show("Se cargó correctamente la información", "Datos agregados", MessageBoxButtons.OK, MessageBoxIcon.Information);
validacion = 1;
conn.Close();
}
}
我在数据库中的存储:
DevCod 解决方案第二版
ALTER PROCEDURE [SistemaFAIFAP].cargaTransTrabajadores
@id uniqueidentifier, @ap NVARCHAR (64), @am NVARCHAR (64), @n NVARCHAR (64) = NULL,
@fn DATE, @pn NVARCHAR (50), @en NVARCHAR (50), @nn NVARCHAR (50),
@nss NVARCHAR (11), @rfc NVARCHAR (10), @hom NVARCHAR (3), @curp NVARCHAR (18),
@ec NVARCHAR (50), @sex NVARCHAR (50), @ce NVARCHAR (50), @cat NVARCHAR (6),
@dc NVARCHAR (64), @calle NVARCHAR (255), @num NVARCHAR (10), @col NVARCHAR (60),
@mun NVARCHAR (50), @ent NVARCHAR (50), @tel NVARCHAR (10), @dep NVARCHAR (3),
@subdep NVARCHAR (2), @dir NVARCHAR (3), @depa NVARCHAR (3), @ofi NVARCHAR (4),
@npl NVARCHAR (4), @cvep NVARCHAR (6), @fig DATE, @nc NVARCHAR (64), @cvee NVARCHAR (64),
@ior FLOAT, @fum
DATE AS
BEGIN TRY
BEGIN TRANSACTION
IF(ISNULL(@n,'')='' OR @n = NULL OR @n = '')
BEGIN
RAISERROR ('@n is null or empty. This is not allowed. Insert will be rollbacked',-- Message text to return to the UI.
16, -- Severity.
1 -- State
)
END
INSERT INTO sistemaFAIFAP.TrabajadorBuffer
VALUES(
@id, @ap, @am, @n, @fn,
@pn, @en, @nn, @nss, @rfc,
@hom, @curp, @ec, @sex, @ce,
@cat, @dc, @calle, @num, @col,
@mun, @ent, @tel, @dep, @subdep,
@dir, @depa, @ofi, @npl, @cvep,
@fig, @nc, @cvee, @ior, @fum
)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_SEVERITY() AS ErrorSeverity,ERROR_STATE() AS ErrorState,ERROR_PROCEDURE() AS ErrorProcedure,ERROR_LINE() AS ErrorLine,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
正如您在图片中看到的,我将null 字段作为测试。
我在字段Nombre 中将我的表定义为Not Null,但它没有显示错误消息,并且信息已插入到表中。
如何防止发送空记录?
(这是我第一次使用事务)为什么我的存储过程不显示错误消息并继续进行,好像字段Nombre 有值?
【问题讨论】:
-
可能是从您的 C# 代码发送了一个空字符串。在您的存储过程中尝试在值中添加
NULLIF(@n, '')。 -
好吧,这行得通,但现在该记录被省略了,即使是错误。我正在尝试发送 102 个注册表,但只加载 101 个。
-
As you can see in the pic, I put a null field as test- 不,我从图片中看不到。我可以从代码中看到您将dgvTrabajadores.Rows[i].Cells["NOMBRE"].Value.ToString()传递给@n。那不会是null。 -
我不知道该说什么,猜猜……谢谢?你帮了很多忙!
标签: c# .net sql-server stored-procedures transactions