我通过尝试将字符串(电影名称)转换为int32(电影ID#)来解决此问题,当我输入电影名称以打印其电影ID号时。我在这里做错了吗?如上所述,它会导致错误:
无法将“System.Data.SqlClient.SqlConnection”类型的对象强制转换为“System.IConvertible”
我的代码:
string filename, connectionInfo;
SqlConnection db;
this.listBox1.Items.Clear();
filename = "netflix.mdf";
connectionInfo = String.Format(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\{0};Integrated Security=True;", filename);
db = new SqlConnection(connectionInfo);
db.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = db;
string moviename = textBox1.Text;
cmd.CommandText = string.Format(
@"SELECT MovieID FROM Movies
where MovieName = '{0}';", moviename);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
db.Close();
int id = System.Convert.ToInt32(cmd);
this.listBox1.Items.Add(id);
答案 0 :(得分:1)
您的cmd对象不是查询的结果,用于执行查询查看ExecuteReader方法。这将返回一个SqlDataReader对象,用于迭代查询结果。
这是来自MSDN的示例:
using (SqlConnection connection = new SqlConnection(
connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(queryString, connection);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(String.Format("{0}", reader[0]));
}
}
在此示例中,queryString
将是您的查询SELECT MovieID FROM MOVIES WHERE...
,connection
将是您的数据库对象
对象reader
可以作为数组(属性索引器)加入,reader[0]
包含第一列读取后第一列的值,多次读取后包含第一列的值列迭代SELECT结果行
此外,您不能将字符串强制转换为int,您需要使用int.Parse或TryParse方法将字符串转换为int。
为了将您知道的第一列字符串转换为int,它将是int.Parse((string)reader[0])
答案 1 :(得分:-1)
在我将它转换为int之前,我应该首先执行标量查询。我忘了在命令行后添加ExecuteScalar()行。
string moviename = textBox1.Text;
cmd.CommandText = string.Format(
@"SELECT MovieID FROM Movies
where MovieName = '{0}';", moviename);
object result = cmd.ExecuteScalar(); //solved my problem!
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
db.Close();
int id = System.Convert.ToInt32(result);
this.listBox1.Items.Add(id);