我正在开发我的第一个程序并面临一些问题请帮我完成它 我在c#中有这段代码:
SqlDataReader dr = null;
dr = cmd.ExecuteReader();
if (dr.Read())
{
client_id = dr["clientid"].ToString();
surname = dr["surname"].ToString();
othername = dr["othername"].ToString();
gender = dr["gender"].ToString();
date_ofbirth = dr["dateofbirth"];
nationality = dr["nationality"].ToString();
//age = dr["Age"];
residential_address = dr["residentialaddress"].ToString();
postal_address = dr["postaladdress"].ToString();
contact_number = dr["telephonenumber"].ToString();
marital_status = dr["maritalstatus"].ToString();
spouse_name = dr["spousename"].ToString();
email = dr["email"].ToString();
occupation = dr["occupation"].ToString();
typeof_id = dr["typeofid"].ToString();
id_number = dr["idnumber"].ToString();
id_expirydate = dr["idexpirydate"];
remarks = dr["remarks"].ToString();
picture = dr["picture"].ToString();
return true;
cmd.CommandText = null;
}
并且错误信息是............... date_ofbirth = dr [“dateofbirth”];
错误2无法将类型'object'隐式转换为'System.DateTime'。存在显式转换
(你是否错过演员?)
C:\ Users \ MICKY \ Documents \ Visual Studio 2008 \ Projects \ Godswill \ Godswill \ Personal.cs 249 28 Godswill
答案 0 :(得分:16)
你应该投射所有,而不是盲目地使用ToString()
:
date_ofbirth = (DateTime) dr["dateofbirth"];
这将根据需要“取消装箱”。
当然,这里更简单的方法是使用ORM或微型ORM(例如“dapper”) - 然后你就运行:
var user = connection.Query<User>("select * from Users where Id=@id",
new {id = 123}).First(); // (this is using "dapper")
其中User
是一个具有与表定义匹配的属性的类,即
public class User {
public string Surname {get;set;}
...
public DateTime DateOfBirth {get;set;}
}
也;请务必在此处阅读using
,即
using(SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.Read()) {...etc...}
}
这对于连接等更为重要,但即使出现错误,它也可以确保资源正确Dispose()
d。这会将您的“init as null替换为null,在最后设置为null”代码,并且具有实际执行某些操作的优势; p
答案 1 :(得分:2)
当你使用这样的东西时
myVar = dr["myColumnName"];
编译器将dr["myColumnName"]
的值视为一个简单对象。你应该在以这种方式分配它之前总是强制转换它:
myVar = (ExpectedType)dr["myColumnName"];
答案 2 :(得分:0)
date_ofbirth = DateTime.Parse(dr["dateofbirth"].ToString());
或安全解析:
DateTime.TryParse(dr["dateofbirth"].ToString(), out date_ofbirth);
答案 3 :(得分:0)
您必须在Convert.ToDateTime
和dr["dateofbirth"]
上使用dr["idexpirydate"]
(因为年龄为int
Convert.ToInt32
,以防万一!)
返回的是object
类型,您必须将其专门转换为定义的DataType,并非所有这些都是字符串,因此ToString()
将不是所有这些字符串的选择。
如果您没有使用可以为空的数据类型,那么检查DBNull
也是一件好事