获取错误:“在SQL中将数据类型nvarchar转换为数字时出错”

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

WEBMETHOD:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] [WebMethod] public List 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( string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID) { List strasseObject = new List(); 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个参数调用Webmethod,方法工作正常,我得到RaumName和RaumID的LIST。 但是,如果我只放一个参数iam得到一个错误:

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

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

预先感谢!

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

例如:将"Hello"传递给数字参数,就会出错。 通过"1234"你没有。 请注意,空字符串或包含空格的字符串无法转换为数值!

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

编辑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); ... } 

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

尝试使用Add方法设置参数,如下所示:

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

这样,如果您不想设置该值,您仍然可以定义参数。

有关更多信息,请访问此处: http : //msdn.microsoft.com/en-us/library/wbys3e9s

将您的字符串转换为intger类型

  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)); 

这样做

 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);