好的,我有以下SQL查询:
query.CommandText = "SELECT FirstName, LastName, Age FROM Characters WHERE LastName LIKE '"+name+"' ORDER BY Age";
这个循环将结果存储在字符串"输出"
中while (reader.Read()) {
output = output + reader.GetString(0) + reader.GetString(1) + reader.GetString(2).ToString();
}
但是,对于第三个属性age
,这是一个int,我得到一个错误
无法将System.Int32转换为System.String
类型
如您所见,我已经尝试使用int.ToString()
函数解决此问题,但我仍然遇到同样的错误。我在这做错了什么?提前谢谢!
答案 0 :(得分:6)
reader.GetString(2).ToString()
没有意义,它或者已经是一个字符串,或者你使用了错误的方法。由于您已经提到它是int
使用reader.GetInt32
:
string firstName = reader.GetString(0);
string larstName = reader.GetString(1);
int age = reader.GetInt32(2);
output = output + string.Format("{0}{1}{2}", firstName, lastName, age);
如果列Age
可以为空,则需要先使用IsDBNull
,然后还可以使用int?
:
int? age = null;
if(!reader.IsDBNull(2))
age = reader.GetInt32(2);
如果您想通过名称而不是索引访问字段,请使用GetOrdinal
:
int ageIndex = reader.GetOrdinal("Age");
int? age = null;
if(!reader.IsDBNull(ageIndex))
age = reader.GetInt32(ageIndex);
作为一个重要的一点,你可以在这里打开sql-injection:
query.CommandText = @"SELECT FirstName, LastName, Age
FROM Characters
WHERE LastName LIKE '" + name + "' ORDER BY Age";
因为你正在连接sql查询。而是使用sql-parameters:
query.CommandText = @"SELECT FirstName, LastName, Age
FROM Characters
WHERE LastName LIKE '%' + @LastName + '%'
ORDER BY Age";
query.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = name;
(如果您不想查找子字符串,则不需要使用LIKE
,那么您可以使用=
)
答案 1 :(得分:1)
同意蒂姆的意见,但
reader[2].ToString();
如果您更改选择顺序,可能会更通用,也可能会减少错误。
以下蒂姆评论:
reader["Age"].ToString();