Мое понимание состоит в том, чтобы передать параметр 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 до нуля, просто для тестирования.
Спасибо за помощь, Джим
значение 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)
)
В 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)";