SQL,C# - 无法将int32转换为字符串?

use*_*921 0 c# sql sql-server asp.net type-conversion

好吧,所以我有以下SQL查询:

 query.CommandText = "SELECT FirstName, LastName, Age FROM Characters WHERE LastName LIKE   '"+name+"' ORDER BY Age";
Run Code Online (Sandbox Code Playgroud)

并且这个循环将结果存储在字符串"output"中

while (reader.Read()) {
    output = output + reader.GetString(0) + reader.GetString(1) + reader.GetString(2).ToString();
}
Run Code Online (Sandbox Code Playgroud)

但是,对于第三个属性age,即int,我得到一个错误

无法将System.Int32转换为System.String类型

如你所见,我已经尝试通过使用该int.ToString()函数来解决这个问题,但我仍然得到相同的错误.我在这做错了什么?提前致谢!

Tim*_*ter 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);
Run Code Online (Sandbox Code Playgroud)

如果列可以Age为空,则需要先使用IsDBNull,也可以使用int?then:

int? age = null;
if(!reader.IsDBNull(2))
    age = reader.GetInt32(2);
Run Code Online (Sandbox Code Playgroud)

如果要按名称而不是通过索引访问字段,请使用GetOrdinal:

int ageIndex = reader.GetOrdinal("Age");
int? age = null;
if(!reader.IsDBNull(ageIndex))
    age = reader.GetInt32(ageIndex);
Run Code Online (Sandbox Code Playgroud)

作为一个重要的一点,你在这里打开sql注入:

query.CommandText = @"SELECT FirstName, LastName, Age 
                      FROM Characters 
                      WHERE LastName LIKE '" + name + "' ORDER BY Age";
Run Code Online (Sandbox Code Playgroud)

因为你正在连接sql查询.而是使用sql参数:

query.CommandText = @"SELECT FirstName, LastName, Age 
                      FROM Characters 
                      WHERE LastName LIKE '%' + @LastName + '%' 
                      ORDER BY Age";
query.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = name;
Run Code Online (Sandbox Code Playgroud)

(如果你不想找到你不需要使用的子串LIKE,那么你可以使用=)