【问题标题】:Issues with INSERT statement (I think)INSERT 语句的问题(我认为)
【发布时间】:2012-10-30 23:23:51
【问题描述】:

我正在为工作中的老板开发报价管理器,但遇到了一些问题。这是一个 WPF C# 应用程序,这是我第一次构建与 SQL Server 数据库一起使用的任何东西。我目前遇到三个问题。

背景:

当用户打开应用程序时,他们会看到一个 DataGrid、一个新的报价按钮和几个我尚未创建的其他控件。当他们按下新报价按钮时,会弹出一个新窗口,其中包含一个包含客户姓名、数量等文本框的表单。该表单的底部是一个提交按钮,此时窗口将关闭,然后他们添加的信息将作为新行插入到 DataGrid 中。

问题一:

我数据库中的一个字段名为 Open_Quote,它应该保留我们收到订单的日期。这是以编程方式处理的,这是我的第一个问题涉及的内容。我将在这篇文章的底部包含所有代码,但是当用户点击提交时,我收到以下错误:“从字符串转换日期和/或时间时转换失败。”

问题二:

为了测试我的其余代码并稍后返回以解决日期问题,我注释掉了该代码并尝试再次运行我的程序。这次我得到一个不同的错误:“'newQuote.Qty'周围的语法不正确。”

问题三:

再次,为了最终测试我的其余代码,注释掉该代码,我收到第三个错误:“字符串或二进制数据将被截断。此过程已终止。”

我希望有一段代码会导致所有这三个问题,但我可能完全不在那儿。我已经拉了一天多的头发试图弄清楚这一点。无论如何,这是代码:

newQuote.xaml.cs:

    private void SubmitQuotebtn_Click(object sender, RoutedEventArgs e)
    {
        CustomerData newQuote = new CustomerData();

        int quantity;
        quantity = Convert.ToInt32(Qtytxt.Text);

        string theDate = System.DateTime.Today.Date.ToString("d");

        newQuote.OpenQuote = theDate;
        newQuote.CustomerName = CustNametxt.Text;
        newQuote.OEMName = OemNametxt.Text;
        newQuote.Qty = quantity;
        newQuote.QuoteNumber = QuoteNumtxt.Text;
        newQuote.FdNumber = FabDrawingNumtxt.Text;
        newQuote.RfqNumber = RfqNumtxt.Text;
        newQuote.RevNumber = RevNumtxt.Text;

        try
        {
            string insertConString = Sqtm.Properties.Settings.Default.SqtmDbConnectionString;

            using (SqlConnection insertConnection = new SqlConnection(insertConString))
            {
                insertConnection.Open();

                SqlCommand cmd = new SqlCommand("INSERT INTO General_Info(Open_Quote, Customer_Name, OEM_Name, Qty, Quote_Num, Fab_Drawing_Num, "
                                                + "Rfq_Num, Rev_Num) values('newQuote.OpenQuote', 'newQuote.CustomerName', 'newQuote.OemName', 'newQuote.Qty' "
                                                + "'newQuote.QuoteNumber', 'newQuote.FdNumber', 'newQuote.RfqNumber', 'newQuote.RevNumber')", insertConnection);

                cmd.ExecuteNonQuery();

            }
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

客户数据.cs:

    class CustomerData
{
    private string _CustomerName;
    private string _OEMName;
    private string _OpenQuote;
    private int _Qty;
    private string _QuoteNumber;
    private string _FdNumber;
    private string _RfqNumber;
    private string _RevNumber;

    public CustomerData()
    {
        // empty constructor
    }

    public string CustomerName
    {
        get { return _CustomerName; }
        set { _CustomerName = value; }
    }

    public string OpenQuote
    {
        get { return _OpenQuote; }
        set { _OpenQuote = value; }
    }

    public string OEMName
    {
        get { return _OEMName; }
        set { _OEMName = value; }
    }

    public int Qty
    {
        get { return _Qty; }
        set { _Qty = value; }
    }

    public string QuoteNumber
    {
        get { return _QuoteNumber; }
        set { _QuoteNumber = value; }
    }

    public string FdNumber
    {
        get { return _FdNumber; }
        set { _FdNumber = value; }
    }

    public string RfqNumber
    {
        get { return _RfqNumber; }
        set { _RfqNumber = value; }
    }

    public string RevNumber
    {
        get { return _RevNumber; }
        set { _RevNumber = value; }
    }
}

作为参考,以下是我在 SQLServer 中设置此表的方式:

Open_Quote, date, not null
Customer_Name, varchar(25), not null
OEM_Name, varchar(25), null
Qty, int, not null
Qute_Num, varchar(20), null
Fab_Drawing_Num, varchar(20), not null
Rfq_Num, varchar(10), null
Rev_Num, varchar(10), null

提前感谢任何帮助我的人,

  • 安德鲁

【问题讨论】:

  • 一切都在引号中......所以你只是插入那些字符串值,而不是实际变量。尝试 values('" + newQuote.OpenQuote + "'" 等...或者只使用参数会更容易阅读
  • 如果您直接对数据库运行插入(即 - 在您正在构建的应用程序之外?)甚至在您的应用程序中硬编码值以查看是否有任何值,您是否会看到相同的错误可以工作的数据组合,然后您可以向后工作。
  • 他没有传递日期 newQuote.OpenQuote,他传递的是字符串“newQuote.OpenQuote”。使用参数dotnetperls.com/sqlparameter
  • 考虑为此查询使用“准备好的语句”。可能会帮助您修复这些错误。
  • 您是否考虑过使用 ORM 而不是直接使用 ADO? LinqToSQL 和 EntityFramework 都让这种操作变得微不足道。

标签: c# sql-server wpf datetime sqldatatypes


【解决方案1】:

使用参数再试一次,让我们知道结果如何。 http://www.dotnetperls.com/sqlparameter

编辑:或者 Tieson T. 所说的。多参与一点就更好了。

要让数据显示在数据网格中,插入后,您可以重新绑定网格。确保您更新数据源,以便它重新提取您刚刚插入的数据。如果您有问题,请说明您在何处/如何设置网格的数据源。

【讨论】:

  • 嘿,迈克,使用参数效果很好。谢谢你的帮助。我正在考虑在未来更多地使用 Linq,但现在这会很好。感谢您所有的帮助。现在我只需要在用户点击子表单中的提交后,在父表单的数据网格中更新数据。我想我可以自己解决,但如果你知道一个好的方法,我当然会感谢你的建议。
  • 嗨,迈克,我一直致力于绑定到数据网格,但它无法正常工作。我在stackoverflow.com/questions/13337558/… 发布了一个新问题。如果这里有人想看一看,我将不胜感激。谢谢。
【解决方案2】:

试试这个:

SqlCommand cmd = new SqlCommand("INSERT INTO General_Info(Open_Quote, Customer_Name, OEM_Name, Qty, Quote_Num, Fab_Drawing_Num, "
                                            + "Rfq_Num, Rev_Num) values('" + newQuote.OpenQuote + "','" + newQuote.CustomerName + "','" + newQuote.OemName + "','" + newQuote.Qty + "','" + newQuote.QuoteNumber + "','" + newQuote.FdNumber + "', '" + newQuote.RfqNumber + "','" + newQuote.RevNumber + "' "
                                            + " )", insertConnection);

【讨论】:

    猜你喜欢
    • 2014-09-02
    • 2019-03-17
    • 2014-05-06
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2013-03-13
    • 2010-12-15
    相关资源
    最近更新 更多