【解決方法】Access データベースに関する C# の問題

プログラミングQA


SQLサーバーではなくC#とAccessデータベースでこのクエリを作成するにはどうすればよいですか
つまり、Max 関数を使用して null 値を 1 に置き換える方法

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

私が試したこと:

null値を1に置き換えようとします
最大機能で。

解決策 1

いくつかの問題があり、コードの潜在的な改善が必要です
1. SQL Injection Vulnerability:

このコードは、Result 変数を SQL クエリ文字列に直接連結するため、SQL インジェクションの脆弱性が発生する可能性があります。 これを防ぐには、パラメータ化されたクエリを使用する必要があります。

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

Unused Code:

da.Dispose() 行と dt.Dispose() 行は return ステートメントの後であるため、実行されることはありません。 リソースを適切に破棄するには、using ステートメントを使用することをお勧めします。 コードの更新バージョンは次のとおりです。

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

Access データベースでは、 NZ この関数は通常、NULL 値を別の指定された値に置き換えるために使用されます。 さらに、Access は SQL Server のような名前付きパラメーターをサポートしていないため、? を使用する必要があります。 クエリ内のパラメーターのプレースホルダーとして使用します。 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をコピーしました