1

这基本上是一个搜索工具。当我在组合框中输入某些内容时,组合框会下拉并显示建议(类似于 Google 搜索栏)

我创建了一个执行一些复杂计算的过程,它采用一个参数并返回一些行。然后我创建了一个组合框事件(更新文本)。

在事件处理程序中,我编写了以下代码:

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]时,它会抛出一个异常,并说存储过程需要未提供的参数。

当我键入许多其他字符时,它会在字符串“我的字符串”末尾抛出无效字符的异常。

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

4

2 回答 2

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); 
    } 
}
于 2012-08-19T01:28:42.343 回答
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,1 或更多,但是一旦添加它们,就必须给出它们的值。conn(connection) 可以传递给 new SqlCmmand() 或 new SqlDataAdapter()

不需要“使用”和“执行”之类的东西

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

两个可选的建议给你

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

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

于 2012-08-19T01:59:42.197 回答