Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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# 无法将数据源中类型字符串的给定值转换为指定目标列的类型float_C#_Asp.net_.net_Sql_Sqlbulkcopy - Fatal编程技术网

C# 无法将数据源中类型字符串的给定值转换为指定目标列的类型float

C# 无法将数据源中类型字符串的给定值转换为指定目标列的类型float,c#,asp.net,.net,sql,sqlbulkcopy,C#,Asp.net,.net,Sql,Sqlbulkcopy,我想知道是否有人能帮忙。我正在尝试读取C#中的CSV文件,并将其数据导入我在SQL 2008中创建的表中 出于某种原因,我不断收到以下错误: “无法删除数据源中字符串类型的给定值 已转换为指定目标列的类型float。“ 完整堆栈跟踪: System.Data.SqlClient.SqlBulkCopy.ConvertValue(Object value, _SqlMetaData metadata, Boolean isNull, Boolean& isSqlType, Boolean&

我想知道是否有人能帮忙。我正在尝试读取C#中的CSV文件,并将其数据导入我在SQL 2008中创建的表中

出于某种原因,我不断收到以下错误:

“无法删除数据源中字符串类型的给定值 已转换为指定目标列的类型float。“

完整堆栈跟踪:

System.Data.SqlClient.SqlBulkCopy.ConvertValue(Object value, _SqlMetaData metadata, Boolean isNull, Boolean& isSqlType, Boolean& coercedToDataFeed)
System.Data.SqlClient.SqlBulkCopy.ReadWriteColumnValueAsync(Int32 col)
System.Data.SqlClient.SqlBulkCopy.CopyColumnsAsync(Int32 col, TaskCompletionSource`1 source)
System.Data.SqlClient.SqlBulkCopy.CopyRowsAsync(Int32 rowsSoFar, Int32 totalRows, CancellationToken cts, TaskCompletionSource`1 source)
System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source)
System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source)
System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken)
System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken)
System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)
System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table)
RMBEventReportingSystemPOC.Admin.ProcessFile(String strFilename) in \Admin.aspx.cs:line 159
请在下面找到我正在使用的代码。请告诉我哪里出了问题:

StatusLabel.Text = "File Process status: File process started!";
try
{

    //var fileName = string.Format(strFilename, Directory.GetCurrentDirectory());

    SqlConnection con = new SqlConnection(@"**ConnectionString**");

    string filepath = Server.MapPath("~/uploads/") + strFilename;
    StreamReader sr = new StreamReader(filepath);
    string line = sr.ReadLine();
    string[] value = line.Split(';');
    DataTable dt = new DataTable();
    DataRow row;
    foreach (string dc in value)
    {
        if (dc == "Month" || dc == "Year" || dc == "Reply")
            dt.Columns.Add(new DataColumn(dc, typeof(int)));
        else if (dc == "CostPerHead" || dc == "TotalCost")
            dt.Columns.Add(new DataColumn(dc, typeof(float)));
        else
            dt.Columns.Add(new DataColumn(dc));
    }

    while (!sr.EndOfStream)
    {
        value = sr.ReadLine().Split(';');
        if (value.Length == dt.Columns.Count)
        {
            row = dt.NewRow();


            //fix up default values                        
            value[1] = value[1] == "" ? "0" : value[1].ToString().Trim();
            value[2] = value[2] == "" ? "0" : value[2].ToString().Trim();
            value[3] = value[3] == "" ? "0.00" : string.Format("{0:0.00}",value[3].ToString());
            value[4] = value[4] == "" ? "0.00" : string.Format("{0:0.00}",value[4].ToString());
            value[7] = value[7] == "" ? "0" : value[7].ToString().Trim();

            row.ItemArray = value;

            dt.Rows.Add(row);
        }
    }

    ////fix up default values

    for (int i = 0; i < dt.Rows.Count; i++)
    {

        dt.Rows[i][1] = int.Parse(dt.Rows[i][1].ToString().Trim());
        dt.Rows[i][2] = int.Parse(dt.Rows[i][2].ToString().Trim());
        dt.Rows[i][3] = Math.Round(float.Parse(dt.Rows[i][3].ToString() + ".00"), 2);
        dt.Rows[i][4] = Math.Round(float.Parse(dt.Rows[i][4].ToString() + ".00"), 2);

        dt.Rows[i][7] = dt.Rows[i][7].ToString() == "" ? 0 : int.Parse(dt.Rows[i]["Reply"].ToString().Trim());
    }

    SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
    bc.DestinationTableName = "Guestlist";
    bc.BatchSize = dt.Rows.Count;
    // add column mappings if necessary               
    con.Open();
    bc.WriteToServer(dt);
    bc.Close();
    con.Close();


    StatusLabel.Text = "File Process status: File process completed! " + dt.Rows.Count.ToString() + " records imported.";
    StatusLabel.CssClass = "success";
}
catch (Exception exx)
{

    StatusLabel.Text = "File Process status: File process failed!: " + exx.Message;
    StatusLabel.CssClass = "error";
}
StatusLabel.Text=“文件进程状态:文件进程已启动!”;
尝试
{
//var fileName=string.Format(strFilename,Directory.GetCurrentDirectory());
SqlConnection con=新的SqlConnection(@“**ConnectionString**”);
字符串filepath=Server.MapPath(“~/uploads/”)+strFilename;
StreamReader sr=新的StreamReader(文件路径);
字符串行=sr.ReadLine();
string[]value=line.Split(“;”);
DataTable dt=新的DataTable();
数据行;
foreach(值中的字符串dc)
{
如果(dc=“月”| | dc=“年”| | dc=“回复”)
添加(新的数据列(dc,typeof(int));
否则如果(dc==“成本人均”| | dc==“总成本”)
添加(新的数据列(dc,typeof(float));
其他的
添加(新数据列(dc));
}
而(!sr.EndOfStream)
{
value=sr.ReadLine().Split(“;”);
if(value.Length==dt.Columns.Count)
{
row=dt.NewRow();
//修正默认值
值[1]=值[1]=“”?“0”:值[1]。ToString().Trim();
值[2]=值[2]=“”?“0”:值[2]。ToString().Trim();
值[3]=值[3]=“”?“0.00”:string.Format(“{0:0.00}”,值[3]。ToString());
值[4]=值[4]=“”?“0.00”:string.Format(“{0:0.00}”,值[4]。ToString());
值[7]=值[7]=“”?“0”:值[7]。ToString().Trim();
row.ItemArray=值;
dt.行。添加(行);
}
}
////修正默认值
对于(int i=0;i

非常感谢任何指针。

您的一个或多个列在数据库中被定义为浮点型

但是,在CSV文件中,列值是字符串或包含无法转换为浮点类型的值

正在转换的列

dt.Rows[i][3] = Math.Round(float.Parse(dt.Rows[i][3].ToString() + ".00"), 2);
dt.Rows[i][4] = Math.Round(float.Parse(dt.Rows[i][4].ToString() + ".00"), 2);
可能已包含浮点数。通过附加“.00”,您现在使其无效,因此转换失败


根据数据的不同,可以删除转换,也可以有条件地使用转换。

您的一个或多个列在数据库中定义为浮点类型

但是,在CSV文件中,列值是字符串或包含无法转换为浮点类型的值

正在转换的列

dt.Rows[i][3] = Math.Round(float.Parse(dt.Rows[i][3].ToString() + ".00"), 2);
dt.Rows[i][4] = Math.Round(float.Parse(dt.Rows[i][4].ToString() + ".00"), 2);
可能已包含浮点数。通过附加“.00”,您现在使其无效,因此转换失败


根据数据的不同,可以删除转换,也可以有条件地使用转换。

对于名为value的变量,应该使用对象数组,而不是字符串数组

然后对指定给它的任何数据调用Convert.ToFloat()方法,这些数据最终将显示在数据库中的浮点列中


将对象数组设置为row.ItemArray时,数据库中浮动的字段也将在数组中浮动,您应该能够提交到数据库ok。

对于名为value的变量,您应该使用对象数组,而不是字符串数组

然后对指定给它的任何数据调用Convert.ToFloat()方法,这些数据最终将显示在数据库中的浮点列中


将对象数组设置为row.ItemArray时,数据库中浮动的字段也将在数组中浮动,您应该能够提交到数据库ok。

SqlBulkCopy.WriteToServer(DataTable)如果
DataTable
的列顺序与数据库中表定义的列顺序不同(这会导致类型或长度不兼容),则
将失败,并显示令人困惑的消息。显然,
WriteToServer
方法没有映射列名。

SqlBulkCopy.WriteToServer(DataTable)
如果
DataTable
的列顺序与数据库中表定义的列顺序不同(当这导致类型或长度不兼容时),则会失败,并出现令人困惑的消息。显然,
WriteToServer
方法没有映射列名