Problème C# avec la base de données Access

la programmation


Comment puis-je effectuer cette requête par la base de données C# et Access plutôt que par le serveur SQL
Je veux dire, comment puis-je remplacer la valeur nulle par 1 avec la fonction 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();
}

Ce que j’ai essayé :

J’essaye de remplacer la valeur nulle par 1
en fonction max.

Solution 1

Il y a quelques problèmes et des améliorations potentielles dans votre code sont nécessaires
1. SQL Injection Vulnerability:

Le code concatène directement la variable Result dans la chaîne de requête SQL, ce qui peut conduire à des vulnérabilités d’injection SQL. Vous devez utiliser des requêtes paramétrées pour éviter cela.

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

Unused Code:

Les lignes da.Dispose() et dt.Dispose() ne seront jamais exécutées car elles se trouvent après l’instruction return. Il est préférable d’utiliser l’instruction using pour garantir une élimination correcte des ressources. Voici une version mise à jour de votre code :

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;
}

Dans les bases de données Access, le NZ La fonction est généralement utilisée pour remplacer les valeurs nulles par une autre valeur spécifiée. De plus, Access ne prend pas en charge les paramètres nommés comme SQL Server, vous devrez donc utiliser ? comme espace réservé pour les paramètres de la requête. Voici comment modifier votre code pour une base de données 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をコピーしました