1

このスクリプトを実行すると、「文字列から日付や時刻を変換するときに変換に失敗しました」というエラーが表示されます。

「While (objReader.Read())」セクションを指します

namespace MedicalDataExporter
{
    public partial class frmSales : Form
    {
        public frmSales()
        {
            InitializeComponent();
        }

        private void dtpFrom_ValueChanged(object sender, EventArgs e)
        {

        }

        private void btnExtract_Click(object sender, EventArgs e)
        {
            SqlConnection objConn = new SqlConnection("Data Source=XXXX;Initial Catalog=YYYY;Persist Security Info=True;User ID=blah;Password=blah");

            // String conStr = Properties.Settings.Default.MedpracConnectionString;
            // System.Data.SqlClient.SqlConnection objConn = new System.Data.SqlClient.SqlConnection(conStr);
            objConn.Open();

            SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(8), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM Invoice WHERE (InvDate >= CONVERT(datetime, '"+dtpFrom.Text +"', 3)) AND (InvDate <= CONVERT(datetime, '"+dtpTo.Text+"',3))", objConn);

            SqlDataReader objReader;
            objReader = objCmd.ExecuteReader();

            System.IO.FileStream fs = new System.IO.FileStream("C:\\CMSExportedData\\Sales-" + DateTime.Now.ToString("dd-MM-yy") + ".txt", System.IO.FileMode.Create);
            System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.Default);

            int count = 0;
            while (objReader.Read())
            {

                for (int i = 0; i < 5; i++)
                {
                    if (!objReader.IsDBNull(i))
                    {
                        string s;
                        s = objReader.GetDataTypeName(i);
                        //MessageBox.Show(s);
                        if (objReader.GetDataTypeName(i) == "char")
                        {
                            sw.Write(objReader.GetString(i));
                        }
                        else if (objReader.GetDataTypeName(i) == "money")
                        {
                            sw.Write(objReader.GetSqlMoney(i).ToString());
                        }
                        else if (objReader.GetDataTypeName(i) == "nvarchar")
                        {
                            sw.Write(objReader.GetString(i));
                        }
                    }
                    if (i < 4)
                    {
                        sw.Write("\t");
                    }
                }
                count = count + 1;

                sw.WriteLine();

            }
            sw.Flush();
            fs.Close();
            objReader.Close();
            objConn.Close();
            MessageBox.Show(count + " records exported successfully.");
            this.Close();
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {
        }
    }
}
4

1 に答える 1

2

文字列を日時に変換するこの行により、例外が発生します。

   CONVERT(datetime,'"+dtpFrom.Text +"', 3)

これに変更

CONVERT(datetime,'"+dtpFrom.Text +"', 0)

詳細については、日時変換を参照してください

SQL サーバーで次の 2 つのクエリをテストします。

SELECT CONVERT(datetime, '11/12/2012', 3) //this causes the exception
SELECT CONVERT(datetime, '11/12/2012', 0)

あなたのコードで:

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(8), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM Invoice WHERE (InvDate >= CONVERT(datetime, '"+dtpFrom.Text +"', 0)) AND (InvDate <= CONVERT(datetime, '"+dtpTo.Text+"',0))", objConn);

よろしくお願いします

于 2012-07-20T06:56:43.293 に答える