从数据库获取字符串值而不使用空值C#

时间:2014-10-30 18:29:01

标签: c# mysql autocomplete textbox

在我的应用程序中,我想将两个文本框自动完成方法与mysql数据库列链接。第一列有3个值,第二列有7个值。

像这样

+---------+---------------+--------------+
+appsetid +   category    + subcategory  + 
+---------+---------------+--------------+
+  1      + property pres + Bankruptcy   +
+  2      + attorney      + app          +
+  3      + valuation     + unknown      +
+  4      +  -null-       + mitigate     + 
+  5      +  -null-       + property re  +
+  6      +  -null-       + close        +
+  7      +  -null-       + unk12        +
+---------+---------------+--------------+

我想把这个列值作为我的文本框自动完成值。但是在我调用下面的方法后,第一个文本框自动完成得到3个值,但第二个文本框自动完成只完成第一个3个值。我试图使用isnullorempty填充文本框,但它无法正常工作

这是我用来填充自动填写文本框的代码。

两个文本框Autocompletemode设置为suggestappend和autocompleet源设置为海关来源

private void maintxtautocomplete()
{
    AutoCompleteStringCollection call = new AutoCompleteStringCollection();
    AutoCompleteStringCollection call2 = new AutoCompleteStringCollection();

    string constring = string.Format("Server=127.0.0.1;Database=claimspro;Uid=root;Pwd=***************;");
    string Query1 = "select * from appsettings ;";
    MySqlConnection conwaqDatabase2 = new MySqlConnection(constring);
    MySqlCommand cmdwaqDatabase2 = new MySqlCommand(Query1, conwaqDatabase2);
    MySqlDataReader myreader;

    try
    {
        conwaqDatabase2.Open();
        myreader = cmdwaqDatabase2.ExecuteReader();

        while (myreader.Read())
        {
            string sName2 = myreader.GetString("subcategory");
            if (!string.IsNullOrEmpty(sName2))
            {
                call.Add(sName2);
            };

            string sName1 = myreader.GetString("category");
            if (!string.IsNullOrEmpty(sName1))
            {
                call2.Add(sName1);
            };
        }
    }

    catch
    {
    }

    categorytxtbox.AutoCompleteCustomSource = call2;
    subcategorytxtbox.AutoCompleteCustomSource = call;
    conwaqDatabase2.Close();
}

3 个答案:

答案 0 :(得分:0)

当尝试将数据库中的NULL转换为字符串时,GetString方法将引发异常。所以正在发生的事情是,在第4个记录中它正在落空你的空洞。在转换之前,您需要检查值是否为NULL。

您希望将代码更改为以下内容:

var catValue = myreader.GetValue("category");
string sName1 = catValue == DBNull.Value ? string.Empty : catValue.ToString(); 

答案 1 :(得分:0)

我发现使用对此有用的扩展方法:

    public static class DataReaderExtensions
    {

            public static string GetStringOrNull(this IDataReader dataReader, string columnName)
            {
                    try
                    {
                            object value = dataReader[columnName];
                            return (value == null || value == DBNull.Value) ? null : (string)value;
                    }
                    catch (Exception exception)
                    {
                            throw new ApplicationException(String.Format("Invalid 'String' data type for column '{0}'", columnName), exception);
                    }
            }

            ...
    }

这将允许您执行以下操作:

using Extensions; // your extension namespace

string sName2 = myreader.GetStringOrNull("subcategory");
if (!string.IsNullOrEmpty(sName2))
{
...

答案 2 :(得分:0)

最后我用dbnull if语句

包装我的cast方法解决了我的问题
 if (myreader["category"] != DBNull.Value)
       {
          string sName1 = myreader.GetString("category");
          call2.Add(sName1);
          comboBox1.Items.Add(sName1);
       };

  if (myreader["subcategory"] != DBNull.Value)
       {
          string sName2 = myreader.GetString("subcategory");
          call.Add(sName2);
          comboBox2.Items.Add(sName2);
       }; 

感谢所有试图帮助我的人:)