我似乎无法正常工作:
我的表格标题是'genre''艺术家''专辑' 我传入的参数是(类型,过滤器,值)(“艺术家”,“流派”,“摇滚”),其中数据库中有两行,类型为“摇滚”。
当我按照调试器时,'while(reader.Read())'必须返回false,因为从不输入循环,因此没有写入List。
public static List<String> getWithFilter(String type, String filter, String value)
{
List<String> columnData = new List<String>();
string query = "SELECT @type FROM Music WHERE" +
" @filter = '@value'";
SqlConnection connection = Database.GetConnection();
SqlCommand getData = new SqlCommand(query, connection);
getData.Parameters.AddWithValue("@type", type);
getData.Parameters.AddWithValue("@filter", filter);
getData.Parameters.AddWithValue("@value", value);
connection.Open();
using (connection)
{
using (getData)
{
using (SqlDataReader reader = getData.ExecuteReader())
{
while (reader.Read())
{
columnData.Add(reader.GetString(0));
}
}
}
}
return columnData;
}
答案 0 :(得分:1)
您不能使用参数作为列的名称,并且在使用它们时不要在它们周围加上引号。现在你的查询相当于
SELECT 'artist' FROM Music WHERE 'genre' = '@value'
您可以改为执行以下操作。
string query = "SELECT " + type + " FROM Music WHERE " + filter + " = @value";
只需删除创建@type
和@fitler
参数的行。
答案 1 :(得分:0)
您正在寻找格式化或字符串插值(需要C#6.0):
string query =
$@"SELECT {type}
FROM Music
WHERE {filter} = @value";
...
getData.Parameters.AddWithValue("@value", value);
格式化更加冗长:
string query = String.Format(
@"SELECT {0}
FROM Music
WHERE {1} = @value", type, filter);
答案 2 :(得分:0)
我假设您正在使用.net 2
DateTime current = DateTime.Now;
Console.WriteLine(current);
SqlConnection conn = new SqlConnection();
string q = "SELECT @field FROM student";
SqlDataAdapter da = new SqlDataAdapter(q, conn);
da.SelectCommand.Parameters.AddWithValue("@field", "snName");
DataTable dt = new System.Data.DataTable();
conn.Open();
da.Fill(dt);
conn.Close();
List<string> names = new List<string>();
foreach (DataRow dr in dt.Rows)
{
names.Add(dr[0].ToString());
}
Console.WriteLine("Fetching {0} data for {1}", names.Count, DateTime.Now - current);
Console.ReadKey();
您可以使用lambda表达式在.net&gt; 4
中映射数据表