我已经和它搏斗了至少3个小时,而且我对C#有些新手,尤其是从SQL Server中的存储过程返回多行时。
我想返回存储过程的结果:
create procedure ingredientNames_givenDishId
@dishid inT
AS
SELECT
a.ingredientname --given dish id, return ingredientnames
FROM
dbo.purple_ingredients a
JOIN
dbo.purple_dish_ingredients b ON a.ingredientid = b.ingredientid
WHERE
b.dishid = @dishid
这是我在SQL Server中执行相同过程时的结果,其中10为dishid:
我的C#代码:
private void btnIngs3FromDishId_Click(object sender, EventArgs e) {
List<Ingredient> someIngs = new List<Ingredient>();
Purple_DataClasses1DataContext dbContextCreateMenu =
new Purple_DataClasses1DataContext(DataHandler.theConnectionString);
foreach (var row in dbContextCreateMenu.ingredientNames_givenDishId(10))
MessageBox.Show(row.ToString());
我也尝试过:
var thing = dbContextCreateMenu.ingredientNames_givenDishId(10);
var anotherThing = thing.AsEnumerable();
foreach (var subthing in anotherThing)
当我设置断点并将鼠标悬停在“anotherThing”上时,最后一个示例实际显示了3个字符串值:
我可以用鼠标向下钻取并查看字符串值一次,然后我会 收到后续尝试的通知:{“查询结果不能多次枚举。”}
非常感谢任何帮助。谢谢!
@Enigmativity:这有帮助,并且实施起来非常简单。这就是我最终得到的结果,这很好用:
var thing= dbContextCreateMenu.ingredientNames_givenDishId(10);
var anotherThing = thing.ToList();
MessageBox.Show(anotherThing.ElementAt(0).ingredientname);
@Sharag&amp; marc_s:让这个老方法也可以工作!!非常感激。其他一些新用户需要注意的一些事项:我需要这一行:
cmd.CommandType = CommandType.StoredProcedure;
另外我需要在这一行中将@dishid显式设置为int,否则它将被编译器视为Object:
cmd.Parameters.AddWithValue("@dishid", Convert.ToInt32(aValue));
答案 0 :(得分:1)
我不是LINQ的专家,但是如果你想要一直有效的旧方法,那就在这里:
List<String> lt = new List<string>();
try{
if (con.State == System.Data.ConnectionState.Closed)
con.Open();
cmd.CommandText = qr;\\the query
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adp.Fill(dt);
for(int i=0;i<dt.Rows.Count;i++)
{lt.Add(dt.Rows[i][0].toString());}
}
catch (SqlException exc)
{ MessageBox.Show(exc.Message); }
答案 1 :(得分:1)
在C#端,您可以使用阅读器,数据表,适配器进行访问。
数据阅读器的示例代码如下所示
SqlConnection connection = new SqlConnection(ConnectionString);
command = new SqlCommand("TestProcedure", connection);
command.CommandType = System.Data.CommandType.StoredProcedure;
connection.Open();
reader = command.ExecuteReader();
List<Test> TestList = new List<Test>();
Test test;
while (reader.Read())
{
test = new Test();
test.ID = int.Parse(reader["ID"].ToString());
test.Name = reader["Name"].ToString();
TestList.Add(test);
}