簡體   English   中英

'='附近的語法不正確。 [WindowsForm]

[英]Incorrect Syntax Near '='. [WindowsForm]

我正在嘗試從SQL Server將數據加載到ComboBox。

這是發生錯誤的方法。

在調試時,此異常在以下行之后捕獲:

metroComboBoxFilterResultsCustomer.ValueMember = "[CD_Id]";

不知道出了什么問題。 請讓我知道此問題的解決方案。

try
{
    string cDateFrom = DateTime.Parse(metroDateTimeCFrom.Text).ToString("yyyy-MM-dd");
    string cDateTo = DateTime.Parse(metroDateTimeCTo.Text).ToString("yyyy-MM-dd");
    dbconnection.Open();
    DataTable dtName = new DataTable();
    string query = "SELECT CD_Id, CD_Customer_Name, CD_Effective_From, CD_Is_Active FROM ADM_Customer_Details WHERE CD_Is_Active = 1 AND CD_Effective_From BETWEEN @cDateFrom AND @cDateTo";
    SqlCommand com = new SqlCommand(query, dbconnection);
    com.Parameters.Add("@cDateFrom", SqlDbType.DateTime).Value = cDateFrom;
    com.Parameters.Add("@cDateTo", SqlDbType.DateTime).Value = cDateTo;
    SqlDataReader reader = com.ExecuteReader();
    if (reader.Read())
    {
        dtName.Load(reader);
    }
    var listNames = CustomerName.ConvertDataTableToList<CustomerIdNameHolder>(dtName)
                 .Where(x => x.CD_Customer_Name == metroTextBoxFilterCName.Text).ToList();
    metroComboBoxFilterResultsCustomer.DisplayMember = "[CD_Customer_Name]";
    metroComboBoxFilterResultsCustomer.ValueMember = "[CD_Id]";
    metroComboBoxFilterResultsCustomer.DataSource = listNames;
}
catch (SqlException ex)
{
    throw ex;
}
finally
{
    if (dbconnection.State == ConnectionState.Open)
        dbconnection.Close();
}

供你參考

請參考與該代碼有關的以下類文件。

類文件:CustomerName.cs

public static class CustomerName
{
    private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
    {
        T item = new T();
        foreach (var property in properties)   
        {
            if (property.PropertyType == typeof(System.DayOfWeek))
            {
                DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), row[property.Name].ToString());
                property.SetValue(item, day, null);
            }
            else
            {
                property.SetValue(item, row[property.Name], null);
            }
        }
        return item;
    }
    public static List<T> ConvertDataTableToList<T>(this DataTable table) where T : new()
    {
        IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
        List<T> result = new List<T>();

        foreach (var row in table.Rows)
        {
            var item = CreateItemFromRow<T>((DataRow)row, properties);
            result.Add(item);
        }
        return result;
        //var customerName = dt.AsEnumerable().Select(dataRow => new CustomerName { Name = dataRow.Field<string>("SUQ_Question") }).ToList();
    }

}

類文件:CustomerIdNameHolder

class CustomerIdNameHolder
{
    public int CD_Id
    {
        get; set;
    }

    public string CD_Customer_Name
    {
        get; set;
    }
}

項目文件下載

如果您考慮更多詳細信息,請在此處下載部分項目源代碼。

請檢查您的系統。 我同時附上了應用程序(已調試)和SQL腳本,以便您遇到與我相同的問題。

請讓我知道是否有人解決此問題。

非常感謝。

您有多個問題:

為comboBox的Display和value成員指定屬性名稱時,請勿使用“ [”和“]”。

在將數據加載到數據表之前,您可能不使用Readed.Read。

    DateTime cDateFrom = DateTime.Parse(metroDateTimeCFrom.Text);
    DateTime cDateTo = DateTime.Parse(metroDateTimeCTo.Text);
    dbconnection.Open();
    DataTable dtName = new DataTable();
    string query = "SELECT CD_Id, CD_Customer_Name, CD_Effective_From, CD_Is_Active 
                    FROM ADM_Customer_Details WHERE CD_Is_Active = 1 AND CD_Effective_From 
                    BETWEEN @cDateFrom AND @cDateTo";
    SqlCommand com = new SqlCommand(query, dbconnection);
    com.Parameters.Add("@cDateFrom", SqlDbType.DateTime).Value = cDateFrom;
    com.Parameters.Add("@cDateTo", SqlDbType.DateTime).Value = cDateTo;
    SqlDataReader reader = com.ExecuteReader();
    dtName.Load(reader);
    var listNames = CustomerName.ConvertDataTableToList<CustomerIdNameHolder>(dtName)
                 .Where(x => x.CD_Customer_Name == metroTextBoxFilterCName.Text).ToList();
    metroComboBoxFilterResultsCustomer.DisplayMember = "CD_Customer_Name";
    metroComboBoxFilterResultsCustomer.ValueMember = "CD_Id";
    metroComboBoxFilterResultsCustomer.DataSource = listNames;

問題不在顯示的代碼中,而在事件處理程序中

metroComboBoxFilterResultsCustomer_SelectedValueChanged

在上面的代碼中設置ValueMember或DisplayMember屬性后,將調用此事件處理程序。 代碼要做的第一件事是嘗試選擇

string query = @"SELECT * FROM ADM_Customer_Details 
                WHERE CD_Is_Active=1 AND CD_Id = " + 
               metroComboBoxFilterResultsCustomer.SelectedValue;

但是在這一點上,metroComboBoxFilterResultsCustomer的SelectedValue為null,這會產生錯誤的sql字符串:

"SELECT * FROM ADM_Customer_Details WHERE CD_Is_Active=1 AND CD_Id = "

正確地,這是不正確的語法在“ =”附近的原因(您可以嘗試在此事件處理程序中放置一個斷點以查看代碼事件的順序)

只需修復該代碼即可添加null測試

private void metroComboBoxFilterResultsCustomer_SelectedValueChanged(object sender, EventArgs e)
{
    try
    {
        if (metroComboBoxFilterResultsCustomer.SelectedValue == null)
            return;
        ....

旁注:查看代碼后,我真的建議您通過所有打開/關閉檢查來刪除該全局連接。 連接是一個一次性對象,其中包含非托管資源 ,應將其保留在盡可能短的時間內。
此處的編碼模式是CREATE / OPEN / USE / CLOSE / DISPOSE,在這種情況下,必須圍繞一次性對象使用using語句

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM