3

asp.net Webservice に 4 つのパラメーターを渡しています。これはこれまでの私のコードです:

ウェブ方法:

    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    [WebMethod]
    public List<RaumHelper.RAUM> Raum(string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID)
    {
        return RaumHelper.Raum(RAUMKLASSE_ID, STADT_ID, GEBAEUDE_ID, REGION_ID);
    }

ヘルパークラス:

   public class RaumHelper
            {
                public class RAUM
                {
                    public string RaumName { get; set; }
                    public string RaumID { get; set; }

                }

                internal static List<RAUM> Raum( string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID)
                {
                    List<RAUM> strasseObject = new List<RAUM>();

                    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 = @Raumklasse_ID OR STADT_ID = @Stadt_ID OR GEBAEUDE_ID = @Gebaeude_ID OR REGION_ID = @Region_ID", con)) 
                    {


                        con.Open();
                        cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID);
                        cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID);
                        cmd.Parameters.AddWithValue("@Gebaeude_ID", GEBAEUDE_ID);
                        cmd.Parameters.AddWithValue("@Region_ID", REGION_ID);



                        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 つのパラメーターを使用してその Web メソッドを呼び出すと、メソッドは正常に機能し、RaumName と RaumID のリストを取得します。しかし、パラメータを 1 つだけ配置すると、エラーが発生します。

    System.Data.SqlClient.SqlException: Error converting data type nvarchar to numeric.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.HasMoreRows()
   at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.Read()

データベース内の ID は数値として保存され、文字列を渡します。それが問題だと思います。しかし、これを修正する方法がわかりません。

また、入力した 2 つまたは 3 つのパラメーターだけでもクエリが機能するようにしたいと考えています。

少し早いですがお礼を!

4

4 に答える 4

8

通常string、SQL Server が文字列の内容を数値自体に変換できる限り、数値のパラメーターに a を渡すことは問題ではありません。それが機能しない場合、このエラーが発生します。

"Hello"例:数値のパラメーターに渡すと、エラーが発生します。合格"1234"しません。空の文字列または空白を含む文字列は数値に変換できないことに注意してください!

しかし、そうするのはスタイルが良くないと言わざるを得ません。問題を回避するために、アプリケーションで使用する型がデータベースの型と一致していることを確認する必要があります。stringアプリケーションに型が必要な理由についての詳細が役立つかもしれません。

EDIT 1
クエリのパラメーターをオプションにするには、次のようにします。

  1. などのオプションのパラメーターを許可するように SQL ステートメントを変更しますWHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID)
  2. @Raumklasse_IDオプションにするか、値を追加する必要がある場合は、パラメーターを追加しないでくださいDBNull.Value

stringプロパティを のような null 許容型に変更することを検討する必要がありますint?

編集 2
これは、編集 1 で提案した変更を実装したコードの外観です。

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) OR STADT_ID = ISNULL(@Stadt_ID, STADT_ID) OR GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) OR REGION_ID = ISNULL(@Region_ID, REGION_ID)", con)) 
{
    con.Open();
    if (!String.IsNullOrWhitespace(RAUMKLASSE_ID))
        cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID);
    else
        cmd.Parameters.AddWithValue("@Raumklasse_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(STADT_ID))
        cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID);
    else
        cmd.Parameters.AddWithValue("@Stadt_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(GEBAEUDE_ID))
        cmd.Parameters.AddWithValue("@Gebaeude_ID", GEBAEUDE_ID);
    else
        cmd.Parameters.AddWithValue("@Gebaeude_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(REGION_ID))
        cmd.Parameters.AddWithValue("@Region_ID", REGION_ID);
    else
        cmd.Parameters.AddWithValue("@Region_ID", DBNull.Value);
    ...
}
于 2012-06-13T12:06:37.087 に答える
0

このようにしてください

cmd.Parameters.Add("@Raumklasse_ID", SqlDbType.Int);// use here your SQL DataType, if it is numberic than use Numeric.
cmd.Parameters[0].value = Convert.ToInt32(RAUMKLASSE_ID);
于 2012-06-13T12:07:40.097 に答える
0

問題は、パラメーターの値を設定していないため、データ型を推測するために何も与えていないことです。

次のように Add メソッドを使用してパラメーターを設定してみてください。

cmd.Parameters.Add("@Raumklasse_ID", SqlDbType.Int).Value = RAUMKLASSE_ID;

そうすれば、値を設定したくない場合でも、パラメーターを定義できます。

詳細については、こちらを参照してください: http://msdn.microsoft.com/en-us/library/wbys3e9s

于 2012-06-13T12:04:15.637 に答える
0

文字列を整数型に変換します

 cmd.Parameters.AddWithValue("@Raumklasse_ID", Convert.ToInt32(RAUMKLASSE_ID));
 cmd.Parameters.AddWithValue("@Stadt_ID", Convert.ToInt32(STADT_ID));
 cmd.Parameters.AddWithValue("@Gebaeude_ID", Convert.ToInt32(GEBAEUDE_ID));
 cmd.Parameters.AddWithValue("@Region_ID", Convert.ToInt32(REGION_ID));
于 2012-06-13T12:05:50.940 に答える