【问题标题】:LINQ to SQL Failing to Insert to the DatabaseLINQ to SQL 无法插入数据库
【发布时间】:2015-12-17 21:57:36
【问题描述】:

我目前正在学习 LINQ,现在我正在尝试使用 Linq to sql 插入,但在插入时遇到了挑战,因为它在我调试时显示不正确的字符串格式,但它没有指向特定的行。你能帮我解决我犯的错误吗?

保存按钮

List<LEGAL_MEMBER> _LegalMemberList = _dc.LEGAL_MEMBERs.Where(a => a.IDNumber == txtIDNumber.Text.ToString()).ToList();

if (rbtnAreYouEmployed.Items[0].Selected == true)
{
    ViewState["AreyouEmployed"] = true;
}
else
{
    ViewState["AreyouEmployed"] = false;
}

if (rbtnIsSACitizen.Items[0].Selected == true)
{
    ViewState["IsSACitizen"] = true;
}
else
{
    ViewState["IsSACitizen"] = false;
}
if (_LegalMemberList != null)
{
    if (_LegalMemberList.Count() == 0)
    {
        LEGAL_MEMBER _legalMember = new LEGAL_MEMBER
        {
            IDNumber = txtIDNumber.Text,
            InceptionDate = Convert.ToDateTime(txtInceptionDate.Text),
            LegalPreferedName = txtPreferedName.Text,
            Initials = txtInitials.Text,
            TitleID = int.Parse(cboTitle.SelectedValue),
            FullNames = txtFullNames.Text,
            Surname = txtSurname.Text,
            Age = int.Parse(txtAge.Text),
            DateOfBirth = Convert.ToDateTime(txtDateOfBirth.Text),
            PassportNumber = txtPassport.Text,
            AreyouEmployed = bool.Parse(ViewState["AreyouEmployed"].ToString()),
            Employer = txtEmployer.Text,
            ContactNumber = txtContactNumber.Text,
            OtherContanctNumber = txtOtherContanctNumber.Text,
            EmailAddress = txtEmailAddress.Text,
            IsSACitizen = bool.Parse(ViewState["IsSACitizen"].ToString()),
            TelephoneWork = txtTelephoneWork.Text,
            TelephoneHome = txtTelephoneHome.Text,
        };

        _dc.LEGAL_MEMBERs.InsertOnSubmit(_legalMember);
        _dc.SubmitChanges();

SQL 表

CREATE TABLE [dbo].[LEGAL_MEMBER](
[LegalMembershipID] [int] IDENTITY(1,1) NOT NULL,
[InceptionDate] [datetime] NULL,
[LegalPreferedName] [nvarchar](50) NULL,
[Initials] [nvarchar](50) NULL,
[TitleID] [int] NULL,
[FullNames] [nvarchar](50) NULL,
[Surname] [nvarchar](50) NULL,
[Age] [int] NULL,
[DateOfBirth] [datetime] NULL,
[IDNumber] [nvarchar](50) NULL,
[PassportNumber] [nvarchar](50) NULL,
[AreyouEmployed] [bit] NULL,
[Employer] [nvarchar](50) NULL,
[ContactNumber] [nvarchar](50) NULL,
[OtherContanctNumber] [nvarchar](50) NULL,
[EmailAddress] [nvarchar](50) NULL,
[IsSACitizen] [bit] NULL,
[TelephoneWork] [nvarchar](50) NULL,
[TelephoneHome] [nvarchar](50) NULL)

【问题讨论】:

  • txtDateOfBirth.Tex 的值是多少? DateOfBirth = int.Parse(txtDateOfBirth.Text)?检查输入以确保它们有意义。
  • 试试 Convert.ToDateTime(txtInceptionDate.Text)
  • LegalMembershipID 是我的主键
  • 您可能在解析文本框值时遇到问题,但在为您的 LegalMembershipID 列指定 IDENTITY 值时最终会失败(它应该是 R/O 列)
  • 来自@hevans900:您可以先在 catch 块中编写一些调试代码,让它将错误的详细信息写入控制台。

标签: c# asp.net sql-server linq


【解决方案1】:

这将是失败的Parse 方法之一。你有一些选项来调试这个:

  1. LEGAL_MEMBER _legalMember = new LEGAL_MEMBER 行上放置一个断点,然后在VS 中尝试Immediate Window 中所有单独的Parse 调用。

  2. 一个接一个地传递属性值,看看它在哪里失败。

    LEGAL_MEMBER _legalMember = new LEGAL_MEMBER();
    _legalMember.LegalMembershipID = int.Parse(txtMemberShipNumber.Text);
    _legalMember.InceptionDate = DateTime.Parse(txtInceptionDate.Text);
    _legalMember.LegalPreferedName = txtPreferedName.Text;
    _legalMember.Initials = txtInitials.Text;
    _legalMember.TitleID = int.Parse(cboTitle.SelectedValue);
    _legalMember.FullNames = txtFullNames.Text;
    _legalMember.Surname = txtSurname.Text;
    _legalMember.Age = int.Parse(txtAge.Text);
    _legalMember.DateOfBirth = int.Parse(txtDateOfBirth.Text);
    _legalMember.IDNumber = txtIDNumber.Text;
    _legalMember.PassportNumber = txtPassport.Text;
    _legalMember.AreyouEmployed = bool.Parse(ViewState["AreyouEmployed"].ToString());
    _legalMember.Employer = txtEmployer.Text;
    _legalMember.ContactNumber = txtContactNumber.Text;
    _legalMember.OtherContanctNumber = txtOtherContanctNumber.Text;
    _legalMember.EmailAddress = txtEmailAddress.Text;
    _legalMember.IsSACitizen = bool.Parse(ViewState["IsSACitizen"].ToString());
    _legalMember.TelephoneWork = txtTelephoneWork.Text;
    _legalMember.TelephoneHome = txtTelephoneHome.Text;
    

【讨论】:

  • 我已经编辑了代码,希望我会发现它是否显示错误。我进行了调试,但在我得到这个值对于 Int32 来说太大或太小之前,我仍然没有指出错误出在哪里。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 " 异常详细信息:System.OverflowException:对于 Int32 而言,值太大或太小。
【解决方案2】:

这很难确定,但您给出的代码中最明显的问题是这一行:

DateOfBirth = int.Parse(txtDateOfBirth.Text)

我假设这会尝试将类似于“09/21/2015”的字符串转换为 Julian 或 OADate 日期?

如果是这样,您需要将字符串转换为日期时间,然后再转换为整数。

要获取日期时间,请尝试

var dob = DateTime.Parse(txtDateOfBirth.Text);

然后获得 OADate 使用

DateOfBirth = dob.ToOADate().

如果您需要儒略日期,请使用如下简单的辅助函数:

public static double ToJulianDate(this DateTime date)
{
    return date.ToOADate() + 2415018.5;
}

(取自this answer

InceptionDate = DateTime.Parse(txtInceptionDate.Text); 也是如此

如果您可以选择,更好的选择是将这些日期作为 DateTime 列存储在数据库中。

【讨论】:

    【解决方案3】:

    我认为您不需要此行:删除此行后尝试插入:

           LegalMembershipID = int.Parse(txtMemberShipNumber.Text) 
    

    因为您的主键字段是自动递增的。请删除它,然后尝试插入。

    【讨论】:

    • 我已经删除了第一行,但仍然无法正常工作。这是现在的错误吗? “对于 Int32 而言,值太大或太小。说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息: System.OverflowException: 对于 Int32,值太大或太小。"
    • 在你的表格脚本中我注意到 [DateOfBirth] 是 int 类型,DOB 怎么可能是 int 类型?
    • 请更新您的数据库以及 LINQ 表设计器中的数据类型,并相应地更新此行:_legalMember.DateOfBirth = int.Parse(txtDateOfBirth.Text);
    • 我已经更新了它,但仍然遇到同样的错误。请帮帮我
    • 如果您能提供帮助,这里是我的团队查看器详细信息:ID:771 744 106 通行证:2088
    【解决方案4】:

    我已经意识到我的复选框是导致问题的地方。经过深入研究,我设法修复了它。以下是我的解决方案,感谢所有帮助过我的人。

                List<LEGAL_MEMBER> _LegalMemberList = _dc.LEGAL_MEMBERs.Where(a => a.IDNumber == txtIDNumber.Text.ToString()).ToList();
    
                if (rbtnAreYouEmployed.Items[0].Selected == true)
                {
                    ViewState["AreyouEmployed"] = true;
                }
                else
                {
                    ViewState["AreyouEmployed"] = false;
                }
    
                if (rbtnIsSACitizen.Items[0].Selected == true)
                {
                    ViewState["IsSACitizen"] = true;
                }
                else
                {
                    ViewState["IsSACitizen"] = false;
                }
                if (_LegalMemberList != null)
                {
                    if (_LegalMemberList.Count() == 0)
                    {
                        LEGAL_MEMBER _legalMember = new LEGAL_MEMBER
                        {
                            IDNumber = txtIDNumber.Text,
                            InceptionDate = Convert.ToDateTime(txtInceptionDate.Text),
                            LegalPreferedName = txtPreferedName.Text,
                            Initials = txtInitials.Text,
                            TitleID = int.Parse(cboTitle.SelectedValue),
                            FullNames = txtFullNames.Text,
                            Surname = txtSurname.Text,
                            Age = int.Parse(txtAge.Text),
                            DateOfBirth = Convert.ToDateTime(txtDateOfBirth.Text),
                            PassportNumber = txtPassport.Text,
                            AreyouEmployed = bool.Parse(ViewState["AreyouEmployed"].ToString()),
                            Employer = txtEmployer.Text,
                            ContactNumber = txtContactNumber.Text,
                            OtherContanctNumber = txtOtherContanctNumber.Text,
                            EmailAddress = txtEmailAddress.Text,
                            IsSACitizen = bool.Parse(ViewState["IsSACitizen"].ToString()),
                            TelephoneWork = txtTelephoneWork.Text,
                            TelephoneHome = txtTelephoneHome.Text,
                        };
    
                        _dc.LEGAL_MEMBERs.InsertOnSubmit(_legalMember);
                        _dc.SubmitChanges();
    

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多