Нулевой параметр не работает с Access и OLE

1

Мое понимание состоит в том, чтобы передать параметр null через ole, который вы используете dbnull.value.

Это мой код

// Add user control to panel
pcMaster.Controls.Add(new ucIndexCodes(DBNull.Value, DBNull.Value));

Элемент управления ucIndexCodes имеет это значение в

public ucIndexCodes(object CustomerID, object ProjectID)
{
    InitializeComponent();
    try
    {
        // Build parameters
        Queue<OleDbParameter> myParameters = new Queue<OleDbParameter>();

        myParameters.Enqueue(new OleDbParameter("@CustomerID", CustomerID));
        myParameters.Enqueue(new OleDbParameter("@ProjectID", ProjectID));

        // Build SQL statement
        string mySQL = "SELECT IndexCodeID, Attitude, Description, recursiveIndexCodeID, CustomerID, ProjectID FROM tblIndexCodes WHERE CustomerID = @CustomerID AND ProjectID = @ProjectID";
        // Get Data
        using (DataTable tblTopIndexCodes = Classes.clsDatabase.GetData(mySQL, myParameters))
        {
            if (tblTopIndexCodes != null)
            {
                foreach (DataRow tmpRow in tblTopIndexCodes.Rows)
                {
                    // Add Root node
                    TreeListNode objRoot = tlIndexCodes.Nodes.Add(new object[] { tmpRow["Attitude"], tmpRow["Description"].ToString() });
                    // Add child node of root
                    AddChildNode(objRoot, Convert.ToInt16(tmpRow["IndexCodeID"]));
                }
            }
        }
    }
    catch (Exception ex)
    {
        ErrorHandle(ex);
    }
}

Проблема в том, что GetData возвращает пустую таблицу, поэтому нет строк, что означает, что она работает правильно, просто ничего не вернула.

internal static DataTable GetData(string mySQL, Queue<OleDbParameter> myParameters = null)
{
    // Data set to return
    DataTable myTable = new DataTable();
    try
    {
        using (OleDbConnection myConn = new OleDbConnection())
        {
            // Open connection to database
            myConn.ConnectionString = getStringConnection();
            myConn.Open();

            // Build SQL command
            using (OleDbCommand myCMD = new OleDbCommand())
            {
                myCMD.CommandText = mySQL;
                myCMD.CommandTimeout = 15000;
                myCMD.CommandType = System.Data.CommandType.Text;
                myCMD.Connection = myConn;
                // Add parameters
                if (myParameters != null)
                {
                    foreach (OleDbParameter myParameter in myParameters)
                    {
                        myCMD.Parameters.Add(myParameter);
                    }
                }

                using (OleDbDataAdapter myData = new OleDbDataAdapter())
                {
                    myData.SelectCommand = myCMD;
                    myData.Fill(myTable);
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.Write(ex.Message.ToString());
        myTable = null;
    }
    return myTable;
}

Когда я запускаю этот SQL в Access, он возвращает ожидаемые данные.

SELECT IndexCodeID, Attitude, Description, recursiveIndexCodeID, CustomerID, ProjectID FROM tblIndexCodes WHERE CustomerID Is Null AND ProjectID Is Null

CustomerID и/или ProjectID не всегда могут быть нулевыми, поэтому мне нужен равный сигнал для таких запросов.

SELECT IndexCodeID, Attitude, Description, recursiveIndexCodeID, CustomerID, ProjectID FROM tblIndexCodes WHERE CustomerID = 1 AND ProjectID = 1

SELECT IndexCodeID, Attitude, Description, recursiveIndexCodeID, CustomerID, ProjectID FROM tblIndexCodes WHERE CustomerID = 1 AND ProjectID = Null

Я не могу найти решение этого. Я убеждался, что CustomerID и ProjectID на самом деле являются нулевыми, установив значение по умолчанию равным null, а также обновив clientid и projectid до нуля, просто для тестирования.

Спасибо за помощь, Джим

Теги:
ms-access
dbnull

2 ответа

3
Лучший ответ

значение NULL - это "неизвестное значение", но NULL не является значением, поэтому его нельзя обрабатывать как значения; для сравнения и оценки NULL вы должны использовать конкретные инструкции.

ваш запрос может быть переписан как:

SELECT IndexCodeID, Attitude, Description, recursiveIndexCodeID, CustomerID, ProjectID
FROM tblIndexCodes
WHERE 
  (
    (@CustomerID is not null and CustomerID = @CustomerID)
    or
    (@CustomerID is null and CustomerID is null)
  )
  AND
  (
    (@ProjectID is not null and ProjectID = @ProjectID)
    or
    (@ProjectID is null and ProjectID is null)
  )
  • 0
    Спасибо, Паоло, я вижу, как Клас и твой человек подходят к этому. Я просто думаю, что это безумие, что вы должны приложить столько усилий, чтобы просто использовать null в вашей строке SQL, но если это так, то так и будет!
1

В SQL сравнение с NULL всегда оценивается как false, даже NULL = NULL.

Вы можете исправить это, изменив свой SQL следующим образом:

       string mySQL = "SELECT IndexCodeID, Attitude, Description, recursiveIndexCodeID, CustomerID, ProjectID FROM tblIndexCodes WHERE (@CustomerID IS NULL OR CustomerID = @CustomerID) AND (@ProjectID IS NULL OR ProjectID = @ProjectID)";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню