【问题标题】:Insert new row to SQL DB using Stored Procedure and two parameters使用存储过程和两个参数将新行插入 SQL DB
【发布时间】:2016-01-31 08:14:33
【问题描述】:

我正在尝试使用带有两个参数的存储过程向 SQL DB 插入新行。我在第一列中使用了 asp.net gridview 和复选框,以便您可以选择该行。对于选择的每一行,它将插入提供 ProjectID 的新行。 CorpID 与查询字符串一起提供。我注释掉了我的代码中的一些行,因为它给了我错误,我不知道如何做剩下的。我正在关注 YouTube 上的视频来完成这项工作。在视频中,他们正在删除行,但我正在尝试插入行。如果有人想要视频的链接,那就是this。这是我的 DataAccessLayer 代码

public void AssociateCorpToProj(ProjectData pd) 
{
    using(SqlConnection cn = new SqlConnection(_dbConnection)) 
    {
        using(SqlCommand cm = new SqlCommand("InsertProjectEntity", cn)) 
        {
            cm.CommandType = CommandType.StoredProcedure;
            cn.Open();
            cm.Parameters.AddWithValue("@ProjectID", pd.ProjectID);
            cm.Parameters.AddWithValue("@CorpID", pd.CorpID);
            cm.ExecuteNonQuery();
            cn.Close();
        }
    }
}

这是我的代码,用于调用 DataAccessLayer 中的方法

protected void btnAssociateProjects_Click(object sender, EventArgs e) 
{
    List < object > lstCorpProjAssoc = new List < object> ();
    foreach(GridViewRow gvRow in gvProjects.Rows) 
    {
        if (((CheckBox) gvRow.FindControl("cbInsert")).Checked) 
        {
            string cID = ((Label) gvRow.FindControl("lblProjectID")).Text;
            lstCorpProjAssoc.Add(cID);
        }
    }

    foreach(ProjectData str in lstCorpProjAssoc)
    {
        DALSectionAccessData ap = new DALSectionAccessData(connString);
        ProjectData pd = new ProjectData();
        ap.AssociateCorpToProj(str);

    }

}

如果有人认为他们需要存储过程的代码,就在这里。

INSERT INTO [dbo].[ProjectEntity]
     ([ProjectID],[CorpID])
VALUES
     (@ProjectID, @CorpID)

另外,我正在使用的列表类

public class ProjectData
{
public string CompanyName { get; set; }
public int ProjectID { get; set; }
public int CorpID { get; set; }
}

如果您需要更多信息来回答问题,请告诉我。非常感谢任何帮助。

【问题讨论】:

  • 问题是我在我正在使用的按钮的 onclick 中使用 List 字符串。错误是"The best overloaded method match for SectionAccessData.AssociateCorpToProj(Entities.ProjectData) has some invalid arguments"
  • List &lt; string &gt; lstCorpProjAssoc = new List &lt; string &gt; (); 我认为你想添加一个 List 所以像 List&lt;ProjectData&gt; lstCorpProjAssoc = new List&lt;ProjectData&gt;(); 这样的东西从那里将每个类对象添加到 List
  • 当我尝试这样做时,我得到了错误:Cannot convert type 'Entities.ProjectData' to 'string' 我在将标签文本放入 cID 的行中得到了这个错误。顺便说一句,我将 cID 设置为 ProjectData。所以现在那行代码是ProjectData cID = ((Label)gvRow.FindControl("Label2")).Text;
  • 声明 List 将把 List 保存为像这样的对象 List lstCorpProjAssoc = new List ();和这样的类列表List&lt;ProjectData&gt; lstProjectData = new List&lt;ProjectData&gt;();
  • 我没有错误以这种方式运行它,如果您没有在 ProjectData 的循环内创建新实例并将它的新实例加载到列表中,您将收到该错误。如果这是一个网络应用程序尝试将 Label2.text 值保存在隐藏字段或会话变量等检查视图状态以及该 Label2

标签: c# mysql asp.net sql-server stored-procedures


【解决方案1】:

尝试运行此示例并逐步执行代码,这将有助于您理解 List&lt;object&gt; vs List&lt;string&gt; vs List&lt;Class&gt;

var listAllData = new List<object>();
for (var cnt = 0; cnt< 10; cnt++)
{
    var lstProjectData = new List<object>() //you need to change yours to be new List<ProjectData>
    {
       string.Empty, //CompanyName
       0, //ProjectID
       0 //CorpId
    }; 

    lstProjectData [0] = string.Format("CompanyName {0}", cnt);
    lstProjectData [1] = cnt+ 1;
    lstProjectData [2] = cnt+ 2;
    listAllData.Add(lstProjectData );

//from your List<ProjectData> you should be able to get at the variable
//as follows someVariable.CompanyName = , 
//someVariable.ProjectId = , 
//and someVariable = CorpId
}

【讨论】:

  • 所以我使用它而不是 ProjectData.cs(我上面的列表类)?
  • 不,您需要使用 List 在 for 循环中声明一个新实例,然后将值分配给 3 个字段后,您需要调用 List 的 .Add 方法 并添加您刚刚填充的 List ..这就是为什么我说逐行遍历此示例并在我的示例中评估并在 listAllData.Add 行上放置断点..您也可以使用我的示例作为替代品,但您必须确保为 company name 、 ProjectId 和 CorpId 分配了正确的值
  • 这让我很困惑。所以我将它添加到按钮中的 foreach 循环中?我还在学习 C#...
【解决方案2】:

DataAccessLayer中的代码:

public void AssociateCorpToProj(int pd, int cd) 
{
    using(SqlConnection cn = new SqlConnection(_dbConnection)) 
    {
        using(SqlCommand cm = new SqlCommand("InsertProjectEntity", cn)) 
        {
            cm.CommandType = CommandType.StoredProcedure;
            cn.Open();
            cm.Parameters.AddWithValue("@ProjectID", pd);
            cm.Parameters.AddWithValue("@CorpID", cd);
            cm.ExecuteNonQuery();
            cn.Close();
        }
    }
}

对于从 DataAccessLayer 调用方法的代码背后的代码:

protected void btnAssociateProjects_Click(object sender, EventArgs e) 
{
    List < int > lstCorpProjAssoc = new List < int > ();
    foreach(GridViewRow gvRow in gvProjects.Rows) 
    {
        if (((CheckBox) gvRow.FindControl("cbInsert")).Checked) 
        {
            int cID = Convert.ToInt32(((Label) gvRow.FindControl("lblProjectID")).Text);
            lstCorpProjAssoc.Add(cID);
        }
    }
    foreach(int pstr in lstCorpProjAssoc) 
    {
        DALSectionAccessData ap = new DALSectionAccessData(connString);
        ap.AssociateCorpToProj(pstr, _cID);

    }
}

不使用列表类。我对此进行了测试,并且有效。参数都是int,所以效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    相关资源
    最近更新 更多