sql 将数字转换为varchar 怎么会变成16进制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 将数字转换为varchar 怎么会变成16进制相关的知识,希望对你有一定的参考价值。

select CONVERT(varchar(50),'5060060001')

我是从Excel 里面导入数据到sql,单独在sql里面执行是正确的
执行出来得到的是:5.06006e+009

这是科学计数法,也就是在excel 中存的是这样,所以 转换时估计select CONVERT(varchar(50),'5.06006e+009') 所以会出现 你说的情况 参考技术A 这个 5.06006e+009 不是16进制, 是科学计数法.追问

那要怎么样才能让它不变科学计数法呢

参考技术B 没错的,只是被省略了而已,还是十进制的,e+009代表10^9
EXCEL对会有省略取舍的,你试试先转到bigint类

将数据类型 varchar 转换为数字时出错。插入语句[重复]

【中文标题】将数据类型 varchar 转换为数字时出错。插入语句[重复]【英文标题】:Error converting data type varchar to numeric. Insert statement [duplicate] 【发布时间】:2017-11-28 00:32:43 【问题描述】:

我收到这个错误

将数据类型 varchar 转换为数值时出错

我认为问题出在下拉列表上,因为例如当用户选择名称时会保存 id。这是我的代码,我也附上截图

Screenshot after I run the code in Visual Studio

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)

    if (e.CommandName.Equals("AddNew"))
    
        TextBox txtActivity = (TextBox)GridView1.FooterRow.FindControl("ftxtActivity");
        TextBox ftxtDate = (TextBox)GridView1.FooterRow.FindControl("ftxtDate");
        TextBox ftxtQno = (TextBox)GridView1.FooterRow.FindControl("ftxtQno");
        DropDownList fddlCName = GridView1.FooterRow.FindControl("fddlCName") as DropDownList;
        DropDownList fddlMmodel = GridView1.FooterRow.FindControl("fddlMmodel") as DropDownList;
        TextBox ftxtQuantity = (TextBox)GridView1.FooterRow.FindControl("ftxtQuantity");
        TextBox ftxtvalueGBR = (TextBox)GridView1.FooterRow.FindControl("ftxtvalueGBR");
        TextBox ftxtvalueEUR = (TextBox)GridView1.FooterRow.FindControl("ftxtvalueEUR");
        TextBox ftxtRate = (TextBox)GridView1.FooterRow.FindControl("ftxtRate");
        TextBox ftxtweightedValue = (TextBox)GridView1.FooterRow.FindControl("ftxtweightedValue");
        DropDownList fddlStatus = GridView1.FooterRow.FindControl("fddlStatus") as DropDownList;
        TextBox ftxtestDecisionDate = (TextBox)GridView1.FooterRow.FindControl("ftxtestDecisionDate");
        TextBox ftxtPromisedDeliveryDate = (TextBox)GridView1.FooterRow.FindControl("ftxtPromisedDeliveryDate");

        con.Open();          
        SqlCommand cmd = new SqlCommand("INSERT INTO SalesActivity(Activity_ID, Date, Quatation_Number, Customer_ID, Product_ID, Quantity, valueGBR, valueEUR, Rate, weightedValue, Status_ID, estDecisionDate, PromisedDeliveryDate) values('" + txtActivity.Text + "','" + ftxtDate.Text + "','" + ftxtQno.Text + "','" + fddlCName.SelectedItem.Value + "','" + fddlMmodel.SelectedItem.Value + "','" + ftxtQuantity.Text + "','" + ftxtvalueGBR.Text + "','" + ftxtvalueEUR.Text + "','" + ftxtweightedValue.Text + "','" + ftxtRate.Text + "','" + fddlStatus.SelectedItem.Value +  "','" + ftxtestDecisionDate.Text + "','" + ftxtPromisedDeliveryDate.Text + "')", con);

        int result = cmd.ExecuteNonQuery();

        con.Close();

        if (result == 1)
        
            userSales();
            Response.Write("<script language=javascript>alert('" + txtActivity.Text + "'+'Sale Details inserted successfully');</script>");
        
        else
        
            Response.Write("<script language=javascript>alert('" + txtActivity.Text + "'+' Sale Details not inserted');</script>");
        
    

【问题讨论】:

您的代码容易受到 SQL 注入攻击。 动态创建 SQL 语句后,在调试器中捕获它。尝试直接执行捕获的查询。我相信您会发现您尝试插入的值未对齐,或者可能在不需要的东西周围有引号。 使用SqlCommandParameters。 如果数据库值是数字(int 等),获取下拉列表的值是不够的。您必须使用 C# 转换函数显式转换,例如:“Conver.ToInt32(...value) @jorenceto 那么这意味着您要么设置参数名称错误,要么您没有在 sqlcommand 参数中设置正确的数据类型。 【参考方案1】:

这个答案将解决 2 个问题

    使用参数化查询防止 SQL 注入 在需要时转换为数值

1+2。 (请注意,为方便起见,我没有为您的所有参数编写代码)

在你的代码后面:

using (SqlConnection conn = new SqlConnection(connStr))

   SqlCommand cmd = new SqlCommand();
   cmd.Connection = conn;
   cmd.CommandType = CommandType.Text;
   cmd.CommandText =  "INSERT INTO SalesActivity(Activity_ID, Date, Quatation_Number, Customer_ID, Product_ID, Quantity, valueGBR, valueEUR, Rate, weightedValue, Status_ID, estDecisionDate, PromisedDeliveryDate) values(@Activity,@Date, @param3 ,@param4,@param5,@param6,@param7,@param8,etc................... )";                
   cmd.Parameters.AddWithValue("@Activity", Convert.ToInt32(txtActivity.Text));

....对所有参数执行此操作(根据需要转换为 Int32)

【讨论】:

我建议连同这个答案一起,OP 学习如何存储过程以消除任何潜在的 SQL 注入和更清晰的代码/可读性【参考方案2】:

除了@DaniDev 的答案,如果您不确定 content 是否是有效的 int ,那么更安全的选择是

int val = 0;
Int32.TryParse( TextBox1.Text, out val );

这将为您提供一些您可以使用的默认值。 Int32.TryParse 还返回一个布尔值,指示它是否能够解析,因此您甚至可以将其用作 if 语句的条件。

请参阅 Int32.TryParse Method (String, Int32) 了解更多详细信息。

【讨论】:

以上是关于sql 将数字转换为varchar 怎么会变成16进制的主要内容,如果未能解决你的问题,请参考以下文章

SQL表单提示"从数据类型varchar转换为int时出错"

SQL中如何将数值格式的20110801(2011年8月01日)转换为日期格式的201108或者2011-08?

在SQL中怎么用convert函数把一位数字转换成两位数?

如何在 SQL 中将 varchar2 转换为数字

SQL Server 2012 将数据类型 varchar 转换为数字时出错

IBM Netezza,如何使用 TO_NUMBER(..., ...) 将 varchar 转换为数字