c# - 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)) 作为默认值。任何帮助,将不胜感激。
解决方案
如果您使用此代码来增加数据库表的主键值,则不应该这样做。您应该使用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();
我强烈建议使用IDENTITY
column 而不是执行所有这些代码。
这将帮助您解决当前的问题。
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();
推荐阅读
- node.js - 通知中心问题
- reactjs - JS TypeError:无法读取未定义的属性“...”,尽管返回了数据?
- javascript - 甚至在打字稿的异步函数中分配的变量返回未定义
- c# - 尝试使用 Oracle.ManagedDataAccess 在 c# 中加载整个表
- linux - 如何在 Tcl/Tk 中自动在标签中换行?
- c++ - 如何替换值对应的二维向量?
- continuous-integration - 如何根据目标机器是否已有文件跳过 GitLab 上的 CI/CD 步骤?
- apache-kafka - 关闭代理,因为所有日志目录都失败了
- heroku - bash: node-v0.10.20-linux-x64/bin/node: 没有这样的文件或目录
- python - 如何使用 Python 在 sqlite3 中保留“'(单引号)”