1

こんにちは、Visual Studio 2010 で Web サービスを構築します。次のような文字列に保存されている ID を取得します。

string room_ids="5,11,99,42";

それらはカンマで区切られています。IDを分割してコンマからループを作成しforeach、IDが完了するまでSQLクエリでそれらを使用しました。しかし、うまくいきません。次のようなエラーが表示されます。

Error converting data type nvarchar to numeric

これが私のコードです。ご協力いただきありがとうございます。

internal static List<RAUM> Raum(string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID)
{       
    List<RAUM> strasseObject = new List<RAUM>();
    string[] allegebaude = GEBAEUDE_ID.Split(new char[] { ',' });

    foreach (string gebaudeid in allegebaude)
    {
        Trace.WriteLine("SIND JETZT DRINNE");
        Trace.WriteLine(gebaudeid);

        using (SqlConnection con = new SqlConnection(@"Data Source=Localhost\SQLEXPRESS;Initial Catalog=BOOK-IT-V2;Integrated Security=true;"))
        using (SqlCommand cmd = new SqlCommand(@"SELECT r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID FROM RAUM r WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) AND STADT_ID = ISNULL(@Stadt_ID, STADT_ID) AND GEBAEUDE_ID = ISNULL(@gebaudeid,GEBAEUDE_ID ) AND REGION_ID = ISNULL(@Region_ID, REGION_ID)", con))
        {
            con.Open();
            if (!StringExtensions.IsNullOrWhiteSpace(RAUMKLASSE_ID))
                cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID);
            else
                cmd.Parameters.AddWithValue("@Raumklasse_ID", DBNull.Value);

            if (!StringExtensions.IsNullOrWhiteSpace(STADT_ID))
                cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID);
            else
                cmd.Parameters.AddWithValue("@Stadt_ID", DBNull.Value);

            if (!StringExtensions.IsNullOrWhiteSpace(GEBAEUDE_ID))
                cmd.Parameters.AddWithValue("@gebaudeid", GEBAEUDE_ID);
            else
                cmd.Parameters.AddWithValue("@gebaudeid", DBNull.Value);

            if (!StringExtensions.IsNullOrWhiteSpace(REGION_ID))
                cmd.Parameters.AddWithValue("@Region_ID", REGION_ID);
            else
                cmd.Parameters.AddWithValue("@Region_ID", DBNull.Value);



            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    if (rdr["BEZEICHNUNG"] != DBNull.Value && rdr["ID"] != DBNull.Value)
                    {
                        strasseObject.Add(new RAUM()
                        {
                            RaumName = rdr["BEZEICHNUNG"].ToString(),
                            RaumID = rdr["ID"].ToString()

                        });
                    }
                }
            }

        }
    }
    return strasseObject;
}
4

4 に答える 4

2

コンマ区切りの文字列 ( と呼ばれるIDstring) に ID が既にある場合は、次のようにすることができます。

sqlQuery = "SELECT Columns FROM table WHERE ID IN (" + IDstring + ")";

特定のケースでは、元の文字列 (GEBAEUDE_ID) を分割せずにそのまま使用します。

   // Don't use a foreach loop any more
   string gebaudeIdSection = " AND GEBAEUDE_ID IN (" + GEBAEUDE_ID + ") ";
   if (string.IsNullOrEmpty(GEBAUDE_ID)) { gebaudeIdSection = ""; } // if there are no ids, let's remove that part of the query completely.
   using (SqlConnection con = new SqlConnection(@"Data Source=Localhost\SQLEXPRESS;Initial Catalog=BOOK-IT-V2;Integrated Security=true;"))
   using (SqlCommand cmd = new SqlCommand(@"SELECT r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID FROM RAUM r WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) AND STADT_ID = ISNULL(@Stadt_ID, STADT_ID)" + gebaudeIdSection + " AND REGION_ID = ISNULL(@Region_ID, REGION_ID)", con))
   { // The rest of the code is the same as before...
于 2012-06-19T07:22:30.337 に答える
1

これを試して:

if (!StringExtensions.IsNullOrWhiteSpace(gebaudeid))
            cmd.Parameters.AddWithValue("@gebaudeid", Convert.ToInt32(gebaudeid));

また、正しいパラメーターを AddWithValue ステートメントに渡す必要があります。ID のリストを反復処理しています。そのリストはallegebaudeです。したがってgebaudeid、現在行っていることの代わりに、パラメーターをステートメントに渡す必要があります。

于 2012-06-19T07:22:36.940 に答える
1

まず第一に、私はあなたが修正しなければならないと思います:

cmd.Parameters.AddWithValue("@gebaudeid", GEBAEUDE_ID);

と:

cmd.Parameters.AddWithValue("@gebaudeid", gebaudeid);

次に、id を整数に変換し (たとえば、 を使用Convert.ToInt32(gebaudeid))、メソッドで文字列として渡さないようにしますAddWithValue

于 2012-06-19T07:26:57.107 に答える
0

コンマで区切られた値のリストを暗黙的に処理することはできません。代わりに、テーブル値関数を作成して値のリストをテーブル構造に分割し、通常どおりこの構造を使用する必要があります。

この質問を見てください: INSERT INTO TABLE from コンマ区切りの varchar-list for a sample function.

于 2012-06-19T07:22:07.270 に答える