none
Ошибка при попытке вставить в SQL таблицу большое число

    Вопрос

  • //CREATE TABLE[dbo].[Table_1] ([IPv6Number][numeric](38, 0) NULL ) ON[PRIMARY]
    
            static void Main(string[] args)
            {
                string connectionString = ConfigurationManager.ConnectionStrings["MySQLServer"].ConnectionString;
                string num = "58569105395146355079250494851844669440"; // 38 digit
                DataTable tbl = new DataTable();
                tbl.Columns.Add(new DataColumn("IPv6Number") { AllowDBNull = true });
                tbl.Rows.Add(num);
    
                using (SqlConnection cn = new SqlConnection(connectionString))
                using (SqlBulkCopy sbc = new SqlBulkCopy(cn))
                {
                    sbc.DestinationTableName = "Table_1";
                    sbc.ColumnMappings.Add(new SqlBulkCopyColumnMapping("IPv6Number", "IPv6Number"));
    
                    cn.Open();
                    try
                    {
                        sbc.WriteToServer(tbl); 
                        cn.Close();
                    }
                    catch (Exception ex)
                    {
                        cn.Close();
                    }
                }
            }
    Этот код вызывает исключение "The given value of type String from the data source cannot be converted to type decimal of the specified target column. Failed to convert parameter value from a String to a Decimal. Value was either too large or too small for a Decimal.", несмотря на то что размер поля numeric(38,0) в таблице позволяет хранить 38-разрядное число (представление IPv6 адреса). Есть ли другие варианты, с обязательным использованием bulk copy? 

Все ответы

  • Начните с того, чтобы перейти на работу с правильным и явно указанным типом данных.
    Кажется, в вашем случае это SqlDecimal

    И явно пропишите типы в DataColumns.
    В целом, чтобы не заниматься бессмысленным копированием схемы, можно просто проинициализировать ваш DataTable схемой таблицы.
    Вот так, к примеру

    var cmd = new SqlCommand("select top 0 * from yourTable", conn);
    var EventData = new DataTable();
    EventData.Load(cmd.ExecuteReader());