1

これは基本的に検索ツールです。コンボボックスに何かを入力すると、コンボボックスがドロップダウンして候補が表示されます (Google 検索バーのようなもの)。

1 つのパラメーターを取り、いくつかの行を返す、いくつかの複雑な計算を行うプロシージャを作成しました。次に、コンボボックス イベント (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」の末尾に無効な文字があるという例外がスローされます。

どうすれば目標を達成できるかについての提案。

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() に渡すことができます

「use」や「exec」などは必要ありません

私をたどると、このリンクは将来ストアドプロシージャに役立つかもしれません http://www.codeproject.com/Articles/15403/Calling-Stored-procedures-in-ADO-NET

あなたのための2つのオプションの提案

  1. 'List' の代わりに変数名 'list' を使用します (使用した)。ただし、System.Collections.Generic を使用して名前空間を追加するまで、この名前で問題は発生しません。ただし、将来この名前空間を使用する必要がある場合があります。

  2. list.Rows[0].ToString(); のみを使用してください。文字列内のデータを操作しているときに、itemarray を取得してから値を取得する必要はありません。

于 2012-08-19T01:59:42.197 に答える