C# 如何使用asp.net将Datatable传递到SQL Server

C# 如何使用asp.net将Datatable传递到SQL Server,c#,asp.net,sql-server,datatable,C#,Asp.net,Sql Server,Datatable,我正在处理一个asp.net web应用程序,其中我正在将一个数据表从asp.net应用程序传递到SQL Server存储过程 我在SQL Server中的表是 Student(ID bigint, Name nvarchar(max), Reg bigint). 在此表中,ID是主键并自动递增。单击按钮时,将数据表传递给存储过程的c#代码是: protected void btnSubmit_Click(object sender, EventArgs e) { try {

我正在处理一个asp.net web应用程序,其中我正在将一个
数据表
从asp.net应用程序传递到SQL Server存储过程

我在SQL Server中的表是

Student(ID bigint, Name nvarchar(max), Reg bigint).
在此表中,
ID
是主键并自动递增。单击按钮时,将
数据表
传递给存储过程的c#代码是:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    try
    {
        DataTable dt = new DataTable("Student");

        dt.Columns.Add("Reg", typeof(long));
        dt.Columns.Add("Name", typeof(string));

        // Create a new row
        for (int i = 0; i < 3; i++)
        {
            DataRow NewRow = dt.NewRow();

            if (i == 0)
            {
                NewRow["Name"] = "Raunak";
                NewRow["Reg"] = Convert.ToInt64(1); ;
            }
            if (i == 1)
            {
                NewRow["Name"] = "Vikash";
                NewRow["Reg"] = Convert.ToInt64(1);
            }
            if (i == 2)
            {
                NewRow["Name"] = "Deepak";
                NewRow["Reg"] = Convert.ToInt64(1);
            }

            dt.Rows.Add(NewRow);
        }

        dt.AcceptChanges();

        string constring = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
        SqlConnection cnn = new SqlConnection(@"Data Source=.\sqlexpress; Initial Catalog=builderERP; Integrated Security=True;");           

        SqlCommand selectCommand = new SqlCommand("Student_Insert_Update_Delete", cnn);
        selectCommand.CommandType = CommandType.StoredProcedure;
        SqlParameter tvpParam = selectCommand.Parameters.AddWithValue("@Student", dt);
        tvpParam.SqlDbType = SqlDbType.Structured;

        cnn.Open();

        int xx = selectCommand.ExecuteNonQuery();

        if (xx > 0)
        {
            lblMsg.Text = "Data Successfully Inserted.";
        }
        else
        {
            lblMsg.Text = "Data Insertion Failed.";
        }
        cnn.Close();

    }
    catch (Exception ex)
    {
        throw (ex);
    }
}
我创建了一个表类型,如下所示:

CREATE TYPE StudentTableVal AS TABLE
(
    Name NVARCHAR(max),
    Reg bigint
) 
但是当我点击按钮将
DataTable
插入
Student
表时,我得到了以下错误:

将数据类型nvarchar转换为bigint时出错。
表值参数“@Student”的数据不符合该参数的表类型


请帮帮我。

我能想到的唯一一件事是,它不是按名称而是按索引映射列,所以请尝试反转列定义,看看会发生什么:

    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Reg", typeof(long));

希望它能起作用。

尝试使用Print命令在SQL中打印@Student参数值一旦获得动态生成的完整SQL字符串,尝试执行Student\u Insert\u Update\u Delete存储过程中编写的完整SQL语句。通过此操作,您将了解数据库中缺少的内容声明

    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Reg", typeof(long));