3

我将 4 个参数传递给 asp.net Web 服务。到目前为止,这是我的代码:

网络方法:

    [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 的列表。但是,如果我只输入一个参数,则会出现错误:

    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 存储为数字,我传递字符串。我认为这就是问题所在。但我不知道如何解决这个问题。

我还希望我的查询也只使用两个或三个输入的参数。

预先感谢!

4

4 回答 4

8

通常,将 a 传递string给数字参数不是问题,只要 SQL Server 能够将字符串的内容本身转换为数值即可。如果这不起作用,您会收到此错误。

例如:传递"Hello"给一个数字参数,你会得到一个错误。通过"1234"你没有。请注意,空字符串或包含空格的字符串不能转换为数值!

但是,应该说这样做不是很好的作风。您应该确保您在应用程序中使用的类型与数据库中的类型匹配以避免出现问题。也许有关为什么您需要string在应用程序中包含类型的更多详细信息可能会有所帮助。

编辑 1
要使查询的参数可选,方法如下:

  1. 更改您的 SQL 语句以允许可选参数,例如WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID).
  2. @Raumklasse_ID如果它应该是可选的,请不要添加参数或添加值DBNull.Value

您真的应该考虑将您的string属性更改为可空类型,例如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

问题可能是您没有提供任何东西来推断数据类型,因为您没有设置参数的值。

尝试使用 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 回答
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 回答