【问题标题】:.Fill Overflow on Phone Number string Auto-converting to Int.Fill 电话号码字符串溢出自动转换为 Int
【发布时间】:2021-11-30 11:07:17
【问题描述】:

我正在根据正确的电话号码格式和“请勿拨打”电话号码的数据库表检查用户上传的电话号码列表,并返回格式不正确或不存在的列表条目桌子。电话号码都定义为 varchar,但 .Fill 会自动将其转换为 int 并引发溢出错误。有谁知道如何获取 .Fill 以将电话号码保留为 varchar?我已经尝试预先声明填充的表列并将电话号码输出定义为存储过程中的 bigint,但这些都没有奏效。应用程序中的所有其他代码都可以正常工作。提前致谢!

错误消息,其中“x”表示电话号码: System.Data.SqlClient.SqlException (0x80131904): varchar 值 'xxxxxxxxxx' 的转换溢出了一个 int 列。声明已终止。

C#:

System.Data.DataTable cleanedList = new System.Data.DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("dbo.uspCleanScrubberLeads", conn))
using (var da = new SqlDataAdapter(cmd))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@ProcedureDate", DateTime.Now);
    cmd.Parameters.AddWithValue("@LeadListTable", dt);
    da.Fill(cleanedList);//Error occurs here!!!
}

SQL:

ALTER PROCEDURE [dbo].[uspCleanScrubberLeads]
    @ProcedureDate datetime2(0),
    @LeadListTable AS LeadListTable READONLY
AS
BEGIN
    SET NOCOUNT ON;
    CREATE TABLE #CleanedLeads (PhoneNumber varchar(20), Reason varchar(200))
    INSERT INTO #CleanedLeads (PhoneNumber, Reason)
    SELECT PhoneNumber, '' FROM @LeadListTable AS t1
    UPDATE #CleanedLeads
        SET Reason = 'Non-numeric phone number' WHERE ISNUMERIC(PhoneNumber) <> 1
    UPDATE #CleanedLeads
        SET Reason = 'Phone is greater than 10 digits' WHERE Reason = '' AND LEN(PhoneNumber) > 10
    UPDATE #CleanedLeads
        SET Reason = 'Phone is fewer than 10 digits' WHERE Reason = '' AND LEN(PhoneNumber) < 10

    --Remove numbers in the DoNotCall table
    DELETE FROM #CleanedLeads WHERE EXISTS (SELECT * FROM DoNotCall WHERE ISNUMERIC(DNCTelephone) = PhoneNumber) 
        AND Reason = ''

    SELECT * FROM #CleanedLeads
END

【问题讨论】:

  • DELETE FROM #CleanedLeads WHERE EXISTS (SELECT * FROM DoNotCall WHERE ISNUMERIC(DNCTelephone) = PhoneNumber) AND Reason = '' 在这里,您将ISNUMERIC(DNCTelephone)VARCHAR(20) 字段PhoneNumber 进行比较。
  • 谢谢!这是我第一次使用 ISNUMERIC,所以我用错了。如果您不介意将您的评论放在答案中,我会将其标记为正确。

标签: c# asp.net .net asp.net-mvc sqldataadapter


【解决方案1】:

在你的声明中:

DELETE FROM
    #CleanedLeads
WHERE
    EXISTS (
        SELECT
            *
        FROM
            DoNotCall
        WHERE
            ISNUMERIC(DNCTelephone) = PhoneNumber
            AND Reason = ''
    )

在这里,您将ISNUMERIC(DNCTelephone)VARCHAR(20) 字段PhoneNumber 进行比较。

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多