Problema de C# con el acceso a la base de datos

programación


¿Cómo puedo realizar esta consulta mediante C# y la base de datos de Access en lugar del servidor Sql?
Quiero decir, ¿cómo puedo reemplazar el valor nulo por 1 con la función Max?

C#
public Int64 GetAccCode(Int64 Result,FRMAccounts xx)
{
    DataTable dt = new DataTable();             
    dt.Clear();             
    SqlDataAdapter da = new SqlDataAdapter();            
    da = new SqlDataAdapter("select isnull(MAX( AccCode),1) from Accounts where AccParent = " + Result + " ", ConClass.con);             
    da.Fill(dt);              
    Int64 MyNewID;             
    MyNewID = Convert.ToInt64(dt.Rows[0][0]);

    if (xx.AccType.SelectedIndex == 0)
    {
        if (MyNewID ==1)
        {
            MyNewID = int.Parse(Result.ToString() + "0".ToString() + 1);
        }
        else
        {
            MyNewID = (Convert.ToInt64(dt.Rows[0][0]) + 1);
        }
    }
    else if (xx.AccType.SelectedIndex == 1)
    {
        if (MyNewID ==1)
        {
            MyNewID = int.Parse(Result.ToString() + "0".ToString() + "0".ToString() + "0".ToString() + 1);
        }
        else
        {
            MyNewID = (Convert.ToInt64(dt.Rows[0][0]) + 1);
        }
    }

    return MyNewID;
    da.Dispose();            
    dt.Dispose();
}

Lo que he probado:

Intento reemplazar el valor nulo por 1
en función máxima.

Solución 1

Hay algunos problemas y se requieren posibles mejoras en su código.
1. SQL Injection Vulnerability:

El código concatena directamente la variable de resultado en la cadena de consulta SQL, lo que puede provocar vulnerabilidades de inyección SQL. Debe utilizar consultas parametrizadas para evitar esto.

C#
da = new SqlDataAdapter("SELECT ISNULL(MAX(AccCode),1) FROM Accounts WHERE AccParent = @Result", ConClass.con);
da.SelectCommand.Parameters.AddWithValue("@Result", Result);

Unused Code:

Las líneas da.Dispose() y dt.Dispose() nunca se ejecutarán porque están después de la declaración de devolución. Es mejor utilizar la declaración de uso para garantizar la eliminación adecuada de los recursos. Aquí hay una versión actualizada de su código:

C#
public Int64 GetAccCode(Int64 Result, FRMAccounts xx)
{
    DataTable dt = new DataTable();
    using (SqlDataAdapter da = new SqlDataAdapter("SELECT ISNULL(MAX(AccCode),1) FROM Accounts WHERE AccParent = @Result", ConClass.con))
    {
        da.SelectCommand.Parameters.AddWithValue("@Result", Result);
        da.Fill(dt);
    }
    Int64 MyNewID = Convert.ToInt64(dt.Rows[0][0]);
    if (MyNewID == 1)
    {
        MyNewID = Int64.Parse($"{Result}{"0".PadLeft(xx.AccType.SelectedIndex * 2, '0')}1");
    }
    else
    {
        MyNewID = MyNewID + 1;
    }
    return MyNewID;
}

En las bases de datos de Access, el NZ La función se utiliza normalmente para reemplazar valores nulos con otro valor especificado. Además, Access no admite parámetros con nombre como SQL Server, por lo que deberá utilizar ? como marcador de posición para los parámetros de la consulta. Así es como puede modificar su código para una base de datos de Access:

C#
public Int64 GetAccCode(Int64 Result, FRMAccounts xx)
{
    DataTable dt = new DataTable();
    using (OleDbDataAdapter da = new OleDbDataAdapter("SELECT NZ(MAX(AccCode), 1) FROM Accounts WHERE AccParent = ?", ConClass.con))
    {
        da.SelectCommand.Parameters.AddWithValue("@Result", Result);
        da.Fill(dt);
    }
    // Rest of your code
}

コメント

タイトルとURLをコピーしました