【问题标题】:How to solve issue cannot implicitly convert System.Data.Datatable to int?如何解决不能将 System.Data.Datatable 隐式转换为 int 的问题?
【发布时间】:2019-01-22 19:09:49
【问题描述】:

我想从 sql server 数据库中选择 patient_no 并使用存储过程将其分配给 int 变量,然后在插入数据库之前比较该值,当我使用存储过程将值分配给变量时出现以下错误出现无法将 System.Data.Datatable 类型隐式转换为 int。

我使用的是 windows 窗体应用程序而不是 webform。

我试图解决这个错误,但我不能。

1- 读取patient_no的存储过程:

create proc [VALIDATE_PATIENT_EXIST]
@Patient_No int
as 
select Patient_No from Users_web
where patient_no = @Patient_No

2- 用于从数据库获取数据的公共 void:

public DataTable VALIDATE_PATIENT_EXIST(int Patient_No)
        {
            DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
            DataTable dt = new DataTable();
            SqlParameter[] Param = new SqlParameter[1];
            Param[0] = new SqlParameter("@Patient_No", SqlDbType.Int);
            Param[0].Value = Patient_No;
            dt = DAL.SelectData("VALIDATE_PATIENT_EXIST", Param);
            DAL.close();
            return dt;
        }

3- 用于从数据库中读取数据的 DataAccessLayer 类:

public DataTable SelectData(string stored_procedure, SqlParameter[] param)
        {
            SqlCommand sqlcmd = new SqlCommand();
            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.CommandText = stored_procedure;
            sqlcmd.Connection = sqlconnection;

            if (param != null)
            {
                for (int i = 0; i < param.Length; i++)
                {
                    sqlcmd.Parameters.Add(param[i]);
                }
            }
            SqlDataAdapter da = new SqlDataAdapter(sqlcmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            return dt;
        }

4- 我调用了类和存储过程,并尝试将存储过程的返回值分配给 int 值:

BL.CLS_PATIENTS patient = new BL.CLS_PATIENTS();
int patient_exist = patient.VALIDATE_PATIENT_EXIST(Convert.ToInt32(txtPatientNo.Text));

错误出现在第 4 步,如何解决此错误以及我需要在代码中更改的内容。

我需要将 patient_no 分配给 int 变量,然后我需要比较它并验证它是否存在患者,然后显示消息该患者已经存在,如果患者不存在,那么我会将其插入数据库表中。

【问题讨论】:

  • 错误的哪一部分你不明白?
  • VALIDATE_PATIENT_EXISTreturns a DataTable 而您正尝试将其转换为 int。例如,您必须使用 dt.AsEnumerable().First().Field&lt;int&gt;("ColumnName") 选择要从中提取数据的行和列。
  • 这一行出现的错误 int patient_exist = patient.VALIDATE_PATIENT_EXIST(Convert.ToInt32(txtPatientNo.Text));无法隐式转换类型 System.Data.DataTable 为 int ,如何解决这个错误并将返回值赋给变量?

标签: c#


【解决方案1】:

该方法返回 DataTable 而不是 int

您需要访问DataTable 中的数据。这可以通过多种方式完成:

BL.CLS_PATIENTS patient = new BL.CLS_PATIENTS();
var patientData = patient.VALIDATE_PATIENT_EXIST(Convert.ToInt32(txtPatientNo.Text));  // datatable

DataRow row = patientData.Rows[0];
int patientExists = row.Field<int>("Patient_No");

或者另一种选择是:

int patientExists = int.Parse(patientData.Rows[0]["Patient_No"]);

更好的选择是更新 VALIDATE_PATIENT_EXISTS 方法并稍微重构:

    public int? GetPatientNumber(int Patient_No)
    {
        DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
        DataTable dt = new DataTable();
        SqlParameter[] Param = new SqlParameter[1];
        Param[0] = new SqlParameter("@Patient_No", SqlDbType.Int);
        Param[0].Value = Patient_No;
        dt = DAL.SelectData("VALIDATE_PATIENT_EXIST", Param);
        DAL.close();

        // if there is at least one row
        if (dt.Rows.Count > 0)
        {
            DataRow row = dt.Rows[0];
            int? patientNumber = row.Field<int>("Patient_No");
            return patientNumber;
        }

        // return null otherwise
        return null;
    }

如果您需要验证患者是否存在,您可以这样做:

var patientNumber = GetPatientNumber(txtPatientNo.Text); // int?
bool patientExists = patientNumber.HasValue;

【讨论】:

  • 这一行 int 出现错误? patientNumber = dt.Rows[0].Field("Patient_No"); 'DataTable' 不包含'Field' 的定义和最佳扩展方法重载'DataRowExtensions.Field(DataRow,int,DataRowVersion) 需要'DataRow' 类型的接收器
  • 您是否在文件顶部添加了using System.Data.DataSetExtensions;?这是.Field 的需要。我刚刚稍微更新了代码——你可以定义一个DataRow 变量。
  • 感谢您的帮助,非常感谢我会尝试您的解决方案
  • @Abdullah 太好了,很高兴你解决了它。如果有帮助,请接受我的回答。
  • 我接受了解决方案,但尝试插入数据库时​​出现另一个错误,此行中出现错误 DataRow row = dt.Rows[0]; System.Data.dll 中出现“System.IndexOutOfRangeException”类型的未处理异常附加信息:位置 0 处没有行。
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 2021-07-27
  • 2017-07-17
  • 2013-01-24
  • 2013-06-12
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多