gpt4 book ai didi

c# - 获取错误 : "Error converting data type nvarchar to numeric" in SQL

转载 作者:行者123 更新时间:2023-11-30 14:00:21 24 4
gpt4 key购买 nike

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

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

提前致谢!

最佳答案

通常将字符串 传递给数字参数不是问题,只要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);
...
}

关于c# - 获取错误 : "Error converting data type nvarchar to numeric" in SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11014322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com