使用存储过程和两个参数将新行插入SQL数据库

本文关键字:参数 新行 插入 数据库 SQL 两个 存储过程 | 更新日期: 2023-09-27 18:19:54

我正试图使用一个包含两个参数的存储过程向SQL DB插入一个新行。我使用的是asp.net网格视图和第一列中的复选框,以便您可以选择行。对于所选的每一行,它将插入提供ProjectID的新行。CorpID与查询字符串一起提供。我把代码中的一些行注释掉了,因为这会给我带来错误,我不知道如何完成其余的操作。我正在YouTube上关注一段视频来完成这项工作。在视频中,他们正在删除行,但我正在尝试插入行。如果有人想要视频链接,那就是这个。这是我来自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; }
}

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

使用存储过程和两个参数将新行插入SQL数据库

尝试运行此示例并逐步完成代码,这将帮助您理解List<object> vs List<string> vs List<Class>

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
}

对于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,所以它工作得很好。