Combobox动态添加行并从SQL Server存储过程下拉

时间:2012-08-19 01:04:59

标签: c# sql-server search drop-down-menu combobox

这基本上是一种搜索工具。当我在组合框中输入一些东西时,组合框会下降并向我显示建议(类似Google搜索栏)

我创建了一个执行一些复杂计算的过程,它接受一个参数并返回一些行。然后我创建了一个组合框事件(On Update Text)。

在事件处理程序中我写了这段代码:

private void combobox_TextUpdate(object sender, EventArgs e)
{
    this.combobox.Items.Clear();
    DataTable List = new DataTable();
    if (this.combobox.Text.Length > 0)
    {
        List = searchIt(combobox.text);
        foreach (DataRow Row in List.Rows)
        {
            this.combobox.Items.Add(Row.ItemArray.GetValue(0).ToString());
        }
        this.combobox.DroppedDown = true;
    }
}

static public DataTable searchIt(string STR)
{
    string connectionString = McFarlaneIndustriesPOSnamespace.Properties.Settings.Default.McFarlane_IndustriesConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    DataTable DT = new DataTable();
    con.Open();
    SqlDataAdapter DA = new SqlDataAdapter("USE [McFarlane Industries] " +
                                               "EXEC search " + 
                                                STR, connectionString);
    DA.Fill(DT);
    con.Close();
    return DT;
}

函数searchIt执行存储过程并返回DataTable。存储过程在SQL Server Management Studio中正常运行。

但是在应用程序中,它在某些情况下无法正常工作。

当我输入 [space] 时,它会抛出一个异常,它表示存储过程需要未提供的参数。

当我输入它们时还有许多其他字符,它会抛出字符串“my string”末尾的无效字符异常。

任何建议如何实现我的目标。

2 个答案:

答案 0 :(得分:2)

使用sqlcommand调用存储过程以填充数据表

using (SqlConnection scn = new SqlConnection(connect)
{    
    SqlCommand spcmd = new SqlCommand("search", scn);

    spcmd.Parameters.Add("@blah", SqlDbType.VarChar, -1); //or SqlDbType.NVarChar

    spcmd.CommandType = System.Data.CommandType.StoredProcedure;

    using (SqlDataAdapter da = new SqlDataAdapter(spcmd)) 
    { 
        da.Fill(dt); 
    } 
}

答案 1 :(得分:1)

static public DataTable searchIt(string STR)
{
    string connectionString =  McFarlaneIndustriesPOSnamespace.Properties.Settings.Default.McFarlane_IndustriesConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    DataTable DT = new DataTable();
    con.Open();
    SqlCommand command = new SqlCommand("Name_of_Your_Stored_Procedure",con);
    command.CommandType=CommandType.StoredProcedure;
    command.Parameters.Add(new SqlParameter("@parameter_name",SqlDbType.NVarChar));
    command.Parameters[0].Value="Your Value in this case STR";
    SqlDataAdapter DA = new SqlDataAdapter(command);
    DA.Fill(DT);
    con.Close();
    return DT;
}

重要: 'parameter_Name'和'Name_of_Your_Stored_Procedure'应替换为您在数据库中拥有的。参数值可以像“abc”(combox.Text)

命令及其类型,其文本是必要的。 添加参数取决于您的存储过程。它们可以是0或更多但是一旦添加它们必须给出它们的值。 conn(连接)可以传递给新的SqlCmmand()或新的SqlDataAdapter()

不需要像'use'和'exec'这样的东西

关注我,此链接将来可能对存储过程有帮助 http://www.codeproject.com/Articles/15403/Calling-Stored-procedures-in-ADO-NET

两个可选建议

  1. 使用变量名'list'而不是'List'(您使用过),但是在使用System.Collections.Generic添加命名空间之前,您不会遇到此名称的问题。但您将来可能需要使用此命名空间。

  2. 仅使用list.Rows [0] .ToString();在处理字符串中的数据时,无需获取itemarray然后获取值;