存储过程可以工作,但不能通过ExecuteNonQuery调用

时间:2020-06-10 04:23:55

标签: c# sql-server

我具有以下功能来更新数据库中的某些数据:

public Boolean ModificarDireccion(DireccionBE dirBE) {
    con.ConnectionString = conection.GetCon();
    cmd.Connection = con;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "PERSONA.ActualizarDireccion";

    try {
        cmd.Parameters.Clear();
        cmd.Parameters.AddWithValue("@id_direccion", dirBE.Id_direccion);
        cmd.Parameters.AddWithValue("@tipo_direccion", dirBE.Tipo_direccion);
        cmd.Parameters.AddWithValue("@id_persona", dirBE.Id_persona);
        cmd.Parameters.AddWithValue("@dir_pais", dirBE.Dir_pais);

        cmd.Parameters.AddWithValue("@dir_provincia", dirBE.Dir_provincia);
        cmd.Parameters.AddWithValue("@dir_ciudad", dirBE.Dir_ciudad);
        cmd.Parameters.AddWithValue("@dir_distrito", dirBE.Dir_distrito);
        cmd.Parameters.AddWithValue("@dir_linea_1", dirBE.Dir_linea_1);

        cmd.Parameters.AddWithValue("@dir_linea_2", dirBE.Dir_linea_2);
        cmd.Parameters.AddWithValue("@dir_codigo_postal", dirBE.Dir_codigo_postal);

        con.Open();
        cmd.ExecuteNonQuery();

        success = true;
    } catch (SqlException x) {
        success = false;
        throw new Exception(x.Message);
    } finally {
        if (con.State == ConnectionState.Open) {
            con.Close();
        }
        cmd.Parameters.Clear();
    }
    return success;
}

使用以下存储过程:

ALTER PROCEDURE [PERSONA].[ActualizarDireccion]
    (
        @id_direccion [int],
        @tipo_direccion [tinyint],
        @id_persona [int],
        @dir_pais [tinyint],
        @dir_provincia [int],
        @dir_ciudad [int],
        @dir_distrito [int],
        @dir_linea_1 [nvarchar](100),
        @dir_linea_2 [nvarchar](100),
        @dir_codigo_postal [varchar](10)
    )
AS
    SET NOCOUNT ON
    SET XACT_ABORT ON

    BEGIN TRANSACTION
        UPDATE PERSONA.DIRECCION
        SET  tipo_direccion = @tipo_direccion, id_persona = @id_persona, dir_pais = @dir_pais, dir_provincia = @dir_provincia, dir_ciudad = @dir_ciudad, dir_distrito = @dir_distrito, dir_linea_1 = @dir_linea_1, dir_linea_2 = @dir_linea_2, dir_codigo_postal = @dir_codigo_postal
        WHERE (id_direccion = @id_direccion)
    COMMIT

这是表格的结构:

CREATE TABLE [PERSONA].[TELEFONO](
    [id_telefono] [int] IDENTITY(1,1) NOT NULL,
    [tipo_telefono] [tinyint] NOT NULL,
    [id_persona] [int] NOT NULL,
    [codigo_pais] [varchar](5) NOT NULL,
    [campo_1] [varchar](5) NOT NULL,
    [campo_2] [varchar](5) NOT NULL,
    [campo_3] [varchar](5) NOT NULL,
    [ext] [varchar](5) NULL,
 CONSTRAINT [PK__TELEFONO_bf60e690] PRIMARY KEY CLUSTERED 
(
    [id_telefono] ASC,
    [tipo_telefono] ASC,
    [id_persona] ASC
)
) ON [PRIMARY]
GO

当我调用此函数时,它不会更新数据库。但是,如果在SSMS中手动使用它,则可以成功更新数据。我想念什么?

我尝试调试,逐步进行操作,对象“ dirBE”中包含正确的数据,但是更改仅未放入数据库中。没有错误,什么都没有。

2 个答案:

答案 0 :(得分:1)

尝试一下。如果可行,则您的代码有问题,Visual Studio将为您生成一个可以复制(或使用)的工作代码

现在,您可以右键单击在表适配器内部进行的查询,然后选择“预览”,以使用VS来测试其运行情况,等等。

要在自己的代码中使用它,请执行以下操作:

new YourQueriesTableAdapterName().YourChosenMethodName(
  dirBE.id_direccion, 
  ...
);

ide肯定会生成工作代码(如果您想将其复制出来,则可以在YourDataSet.Designer.cs中找到,或者可以将其保留在其中,而仅使用tableadapter-本质上与您使用的是相同的东西重新处理您的代码,创建一个单独的类来调用存储过程),因此,如果遇到与您的问题相同的问题,那么我会说这归结为以下几件事之一:

  • 您正在查找与程序正在更新的数据库不同的数据库
  • 您为id_direccion传递的值在表中不存在
  • 存在一些值转换错误或期望值不匹配,这意味着您认为c#正在发送的值和其实际发送的值是不同的(请参见上述错误)

er ..就是这样!

答案 1 :(得分:0)

using (SqlConnection con = new SqlConnection(conection.GetCon()))
{
    using (SqlCommand cmd = new SqlCommand("PERSONA.ActualizarDireccion", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@id_direccion", SqlDbType.Int).Value = dirBE.Id_direccion;
        cmd.Parameters.Add("@tipo_direccion", SqlDbType.TinyInt).Value = dirBE.Tipo_direccion;
        cmd.Parameters.Add("@id_persona", SqlDbType.Int).Value = dirBE.Id_persona;
        cmd.Parameters.Add("@dir_pais", SqlDbType.TinyInt).Value = dirBE.Dir_pais;
        cmd.Parameters.Add("@dir_provincia", SqlDbType.Int).Value = dirBE.Dir_provincia;
        cmd.Parameters.Add("@dir_ciudad", SqlDbType.Int).Value = dirBE.Dir_ciudad;
        cmd.Parameters.Add("@dir_distrito", SqlDbType.Int).Value = dirBE.Dir_distrito;
        cmd.Parameters.Add("@dir_linea_1", SqlDbType.NVarChar).Value = dirBE.Dir_linea_1;
        cmd.Parameters.Add("@dir_linea_2", SqlDbType.NVarChar).Value = dirBE.Dir_linea_2;
        cmd.Parameters.Add("@dir_codigo_postal", SqlDbType.VarChar).Value = dirBE.Dir_codigo_postal;

        con.Open();
        cmd.ExecuteNonQuery();
    }
}