如何解决无法将System.Data.Datatable隐式转换为int的问题?

时间:2019-01-22 19:09:50

标签: c#

我想从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-用于从数据库获取数据的公共无效空间:

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变量,然后需要对其进行比较并验证是否存在患者,然后如果患者不存在,则显示该患者已经存在的消息,然后将其插入数据库表中。

1 个答案:

答案 0 :(得分:3)

该方法返回的是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;