首页 > 解决方案 > char '00' 未从 C# 中的 SQL Server 转换为 int 01

问题描述

我正在从 char(2) 数据类型的数据库中获取一列。在一个事件中,我将 char 数据类型更改为 int 并将其增加 1。通过以下代码:

int i = 0;
using (SqlConnection sqlCon = new SqlConnection(Login.connectionString))
{
    string commandString = "SELECT MAX(CAST(Category_Code as INT)) FROM Category;";

    SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
    sqlCon.Open();
    SqlDataReader dr = sqlCmd.ExecuteReader();
    while (dr.Read())
    {
        i = 1;
        if(dr[0] == null)
        {
            Ctgry_CtgryCodeCb.Text = "1";
        }                
        else
        {
            int cat_next_code = int.Parse(dr[0].ToString());
            Ctgry_CtgryCodeCb.Text = (cat_next_code + 1).ToString();                
        }

它工作正常,但不是第一次(不添加 1 到空或 0),因为列是空的。它显示一些错误,它不是正确的转换格式。我还将列的默认值设置为0 但它显示 ((0)) 作为默认值。任何帮助,将不胜感激。

错误

标签: c#visual-studio-2015sql-server-2012-express

解决方案


如果您使用此代码来增加数据库表的主键值,则不应该这样做。您应该使用IDENTITY数据库中可用的列功能。

由于您没有解释为什么不使用IDENTITY列,因此看起来此代码是出于其他目的。

根据您的代码,您将从数据库中获取某些列的最大值并在代码中将其递增一。

当数据库中的表为空时,您将一无所获。所以While循环根本不会被执行。因此,即使您在 while 循环中检查 NullOrEmpty,它也永远不会被执行。

你也不需要在SqlDataReader这里使用。由于您只从查询中返回一个值,您可以使用ExecuteScalar方法SqlCommand并获取该值。它会更简单。

var codeFromDb = sqlCmd.ExecuteScalar();
var cat_next_code = 0; 

if(!(codeFromDb is DBNull))
{
     cat_next_code =  Convert.ToInt32(codeFromDb);
}

Ctgry_CtgryCodeCb.Text = (cat_next_code + 1).ToString();

我强烈建议使用IDENTITYcolumn 而不是执行所有这些代码。

这将帮助您解决当前的问题。

SqlDataReader在这种情况下是矫枉过正的,我不喜欢回答错误的方法,但既然你坚持考虑跟随。

SqlDataReader dr = sqlCmd.ExecuteReader();
int cat_next_code = 0;

if(dr.Read()) // while is not needed here. There will be only one row in the reader as per the query.
{
     i = 1;

     if(!dr.IsDBNull(0))
     {
         cat_next_code = int.Parse(dr[0].ToString());
     }
 }

 Ctgry_CtgryCodeCb.Text = (cat_next_code + 1).ToString();

推荐阅读