Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构化类型中没有足够的字段。结构化类型必须至少有一个字段C#_C#_Sql_Sql Server_Winforms - Fatal编程技术网

结构化类型中没有足够的字段。结构化类型必须至少有一个字段C#

结构化类型中没有足够的字段。结构化类型必须至少有一个字段C#,c#,sql,sql-server,winforms,C#,Sql,Sql Server,Winforms,我的winforms中有一个问题,当我通过存储过程将数据表传递给sql server时,我得到了一个与标题问题相同的错误。 有人能帮我解决吗 dbHelper类中的方法ExecDB连接到sql并传递数据: public static DataSet ExecDB(string procName, params object[] obj) { SqlConnection sqlCon = new SqlConnection(conString);

我的winforms中有一个问题,当我通过存储过程将数据表传递给sql server时,我得到了一个与标题问题相同的错误。 有人能帮我解决吗

dbHelper类中的方法ExecDB连接到sql并传递数据:

public static DataSet ExecDB(string procName, params object[] obj)
        {
            SqlConnection sqlCon = new SqlConnection(conString);
            if (sqlCon.State == ConnectionState.Closed) sqlCon.Open();
            SqlDataAdapter da = new SqlDataAdapter(procName, sqlCon);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            SqlCommandBuilder.DeriveParameters(da.SelectCommand);
            if (da.SelectCommand.Parameters.Count - 1 != obj.Length) throw new Exception("Error");
            int index = 0;
            foreach (SqlParameter pr in da.SelectCommand.Parameters)
            {
                if (pr.Direction == ParameterDirection.Input || pr.Direction == ParameterDirection.InputOutput)
                {
                    pr.Value = obj[index++];
                    //pr.SqlDbType = SqlDbType.Structured;
                }
            }
            DataSet ds = new DataSet();
            da.Fill(ds);
            if (sqlCon.State == ConnectionState.Open) sqlCon.Close();
            return ds;
        }
这是我的数据表将通过的:

DataTable dt = new DataTable();
dt.Clear();
dt.Columns.Add("NgayGiam", typeof(DateTime));
dt.Columns.Add("Tile", typeof(int));
dt.Columns.Add("Thang", typeof(string));
dt.Columns.Add("MaMon", typeof(int));
DataRow dr = dt.NewRow();
dr["NgayGiam"] =Convert.ToDateTime(i.SubItems[0].Text);
dr["Tile"] =Convert.ToInt32(tbxTiLeGiam.Text);
dr["Thang"] = twoMonth.Substring(twoMonth.Length - 2) + DateTime.Now.Year;
dr["MaMon"] = Convert.ToInt32(i.Tag.ToString());
dt.Rows.Add(dr);
下面是SQL中的结构:

CREATE TYPE BANGGIAMGIA AS TABLE(
NgayGiam DATE NOT NULL,
Tile INT NOT NULL,
Thang VARCHAR(6) NOT NULL,
MaMon INT NOT NULL
)
和SQL中的进程:

create proc sp_UpdateGiamGia
@temp as BANGGIAMGIA ReadOnly
as
begin
    Insert into GIAMGIA Select b.NgayGiam, b.Tile, b.Thang, b.MaMon from @temp as b
    Select * from GIAMGIA where MONTH(Ngaygiam) = Month(Getdate()) and year(NgayGiam) = Year(getdate())
end
我不明白为什么会这样。请给我解释一下


谢谢。

您应该在MSDN上查找SqlDataAdapter.Fill()方法的文档,并通读一遍,直到您看到可以简化此处的一些代码。@JoelCoehoorn T_TI仍然可以将每条记录传递到destinations表,但我想一次传递哪一行代码出错?您是否尝试在da.Fill(ds)处设置pr.TypeName=“BANGGIAMGIA”和pr.SqlDbType=SqlDbType.Structured?@ChetanRanpariya。我试过了