Как передать параметр табличного значения в пользовательскую таблицу данных, используя C # и SQL - PullRequest
0 голосов
/ 13 декабря 2018

Ниже моя хранимая процедура и мой код C #.В настоящее время количество моих строк составляет 1000+, но когда я делаю tvp.Rows.Count, я получаю 90, я считаю, что мой цикл for на самом деле не заполняет все правильно.Вот мой фрагмент кода ниже.Имейте в виду, что таблица данных не заполняет мою таблицу в SQL Server.

Хранимая процедура:

ALTER PROCEDURE [dbo].[TableName] 
    @dt AS dbo.DataTableAsType READONLY   
AS
BEGIN
   INSERT INTO dbo.[DataTableAsType] ([Column names]) --There are 89 column names
       SELECT
           ([ColumnNames])
       FROM 
           @dt
END

Вторая хранимая процедура:

    @totalRecords INT OUTPUT
INSERT INTO dbo.tablename1 
FROM dbo.tablename2

SELECT @totalRecords = COUNT(*) 
FROM dbo.[tableName2]

Код C #:

public void InsertDataTableAF2CSV(string ext)
{
    DataTable tvp = new DataTable();
tvp = ReadFile(filename, "", null);

using (StreamReader sr = new StreamReader(filename))
    {
        //this assume the first record is filled with the column names   
        //if (headerRowHasBeenSkipped)
        string headerValue = sr.ReadLine();

        string[] headers = sr.ReadLine().Split(',');
        foreach (string header in headers)
        {
            tvp.Columns.Add(header);
        }
        while (!sr.EndOfStream)
        {
            string[] rows = sr.ReadLine().Split(',');
            //Create a new row
            DataRow dr = tvp.NewRow();
            for (int i = 0; i < headers.Length; i++)
            {
                dr[i] = rows[i];
            }
            tvp.Rows.Add(dr);
            // Console.WriteLine(tvp);
        }          
    }  

  // Passing a table-valued parameter to a stored procedure
    using (SqlConnection con = new SqlConnection(connection name))
    {
        connection.Open();
        // Execute the cmd
        // Configure the command and parameter. 
        SqlCommand cmd = new SqlCommand("dbo.storedprocedure", connection);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandTimeout = 5000;

        // SqlParameter tvparam = cmd.Parameters.AddWithValue("@dt", tvp);

        // Create a DataTable with the modified rows.  
        DataTable addedCategories = tvp.GetChanges(DataRowState.Added);

        // these next lines are important to map the C# DataTable object to the correct SQL User Defined Type
        SqlParameter parameter = new SqlParameter("@dt", SqlDbType.Structured)
                {
                    //TypeName = "dbo.DataTableAsType",
                    TypeName = "dbo.importDataTable",
                    Value = tvp
                };                                   

        cmd.ExecuteNonQuery();
        con.Close();
    }
}

1 Ответ

0 голосов
/ 13 декабря 2018

В твп вы добавляете 90 строк, поэтому количество строк должно составлять только 90.См. Ниже - вы повторяли его как arr.length и длина массива только 90.

       for (int i = 0; i <= arr.Length; i++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...