C# 使用WCF从Gridview保存

C# 使用WCF从Gridview保存,c#,gridview,ado.net,C#,Gridview,Ado.net,因此,我将Gridview与WCF一起使用。我已经设法将文本框插入gridview,但现在我正努力通过WCF服务保存gridview。我尝试了一下,发现了这个错误: 参数化查询“(@Item1 narchar(4),@Item2 nvarchar(4000)) 插入到“需要未提供的参数”@item2“ 这是我的密码: public string InsertProcesses(ProcessDetails proDetails) { string Message; SqlConn

因此,我将Gridview与WCF一起使用。我已经设法将文本框插入gridview,但现在我正努力通过WCF服务保存gridview。我尝试了一下,发现了这个错误:

参数化查询“(@Item1 narchar(4),@Item2 nvarchar(4000)) 插入到“需要未提供的参数”@item2“

这是我的密码:

public string InsertProcesses(ProcessDetails proDetails)
{
    string Message;
    SqlConnection con = new SqlConnection(@"Data Source=localhost;Initial Catalog=WCFTest;Integrated Security=True;Pooling=False");
    con.Open();

    SqlCommand cmd = new SqlCommand("insert into SaveProcesses(Item1, Item2)values(@Item1, @Item2)", con);
    cmd.Parameters.AddWithValue("@Item1", proDetails.Item1);
    cmd.Parameters.AddWithValue("@Item2", proDetails.Item2);
    int result = cmd.ExecuteNonQuery();

    if (result == 1)
    {
        Message = proDetails.Item1+ "Details accepted";
    }
    else
    {
        Message = proDetails.Item1+ "Details not accepted";
    }

    con.Close();

    return Message;
}

for (int i = 0; i < dataGridView2.Rows.Count; i++)
{
    ServiceReference6.ProcessDetails det2 = new ServiceReference6.ProcessDetails();

    det2.Processes = dataGridView2.Rows[i].Cells["Item1"].Value.ToString();
    det2.Processes = dataGridView2.Rows[i].Cells["Item2"].Value.ToString();
    obj6.InsertProcesses(det2);   

您收到的错误是SQL错误-它与WCF无关,只是发生在WCF操作契约(方法)中

基于
ProcessDetails
的代码,
Item1
Item2
都没有在
for
循环中进行设置(您在两行中设置了相同的[不存在]属性)。像这样的事情似乎更合适:

det2.Item1 = dataGridView2.Rows[i].Cells["item1"].Value.ToString();
det2.Item2 = dataGridView2.Rows[i].Cells["item2"].Value.ToString();
此外,您可以在数据协定中使用自动属性以减少代码:

[DataContract] 
public class ProcessDetails 
{ 

    [DataMember] 
    public int Id { get; set; }

    [DataMember] 
    public string Item1 { get; set; }

    [DataMember] 
    public string Item2 { get; set; }
}

您编写类的方式没有任何问题,上面的方式只允许您用更少的输入完成相同的操作。

proDetails。Item2
null?Item2包含信息。在数据库中,没有一个设置为null,很抱歉,我是WCF新手,并且感到困惑。您有一个SQL错误,而不是WCF错误。您期望在Item2中发生的事情没有发生。什么是
det2.进程
?不管它是什么,当您将“item2”单元格分配给它时,您正在for循环中覆盖它。您可以发布更多的代码吗?应该分别是
det2.processs.Item1=“和
det2.processs.Item2=?还是类似的?
ProcessDetails
的代码特别有助于我们解决这个问题。[DataContract]公共类ProcessDetails{int-id;string-item1;string-item2;[DataMember]公共int-id{get{return-id;}set{id=value;}[DataMember]公共字符串Item1{get{return Item1;}set{Item1=value;}}[DataMember]公共字符串Item2{get{return Item2;}set{Item2=value;}那么这与我的sql数据库有关吗?不,或者至少不一定。问题是,您发布的代码没有填充属性
Item1
Item2
-您正在将网格中的两个单元格都分配给名为
进程
(在您的DataContract代码中甚至不存在)的属性,因此您将空值传递到SQL命令的参数中。进程应该是Item1和Item2,我正在更改列名。我注意到我犯了一个小错误,我列出了Item1两次,而不是“进程”所在的Item1和Item2,对其进行了更改,我得到了这个错误“Object reference not set to a instance of a Object”(对象引用未设置为对象实例)感谢您迄今为止的帮助上次错误已清除。当我现在尝试保存它时,此错误显示为“Object reference not set to a instance of a Object”(对象引用未设置为对象实例)“该错误发生在哪一行代码上?错误本身是不言自明的,但它可能发生在您发布的代码中的任何位置。请在调试器中逐步检查您的代码,这将突出显示发生此异常的那一行。”。
[DataContract] 
public class ProcessDetails 
{ 

    [DataMember] 
    public int Id { get; set; }

    [DataMember] 
    public string Item1 { get; set; }

    [DataMember] 
    public string Item2 { get; set; }
}