Hice un método para obtener un escalar de una base de datos usando ExecuteScalar pero está lanzando una excepción. La declaración de selección de SQL me parece correcta. Puede alguien ayudarme por favor.

El error exacto que obtengo es

Sintaxis incorrecta cerca de "Facturas".

Código:

public static String GetTotalBalanceDue() 
{
        decimal totalBalanceDue;

        string selectStatement =
            "SELECT SUM(InvoiceTotal - PaymantTotal - CreditTotal) " +
            "AS BalanceDue FROM Invoices" +
            "WHERE InvoiceTotal - PaymantTotal - CreditTotal > 0";

        try
        {
            using (SqlConnection connection = PayablesDBConnection.GetConnection())
            {
                connection.Open();

                using (SqlCommand selectCommand = new SqlCommand(selectStatement, connection))
                {
                    totalBalanceDue = (decimal)selectCommand.ExecuteScalar();
                }
            }
        }
        catch (SqlException ex)
        {
            //exceptions are thrown to the controller, then to the view
            //Please make sure that do not use MessageBox.Show(ex.Message) in the DAL
            //because it couples the DAL with the view

            //throw is used instead of throw ex because the former preserves the stack trace
            throw;
        }
        catch (Exception ex)
        {
            throw;
        }

        return System.Convert.ToString(totalBalanceDue);
    }

Modifiqué mi declaración de selección para que sea:

            string selectStatement =
                "SELECT SUM(InvoiceTotal - PaymentTotal - CreditTotal)" +
                "AS BalanceDue" +
                "FROM Invoices " +
                " WHERE vendorID =" + vendorID;

Pero sigo recibiendo

Sintaxis incorrecta cerca de "Facturas".

0
mediumM 29 ene. 2016 a las 06:23

2 respuestas

La mejor respuesta

Modificar

 string selectStatement =
            "SELECT SUM(InvoiceTotal - PaymantTotal - CreditTotal) " +
            "AS BalanceDue FROM Invoices" +
            "WHERE InvoiceTotal - PaymantTotal - CreditTotal > 0";

A:

string selectStatement =
            "   SELECT SUM(InvoiceTotal - PaymantTotal - CreditTotal) " +
            "   AS BalanceDue FROM Invoices" +
            "   WHERE InvoiceTotal - PaymantTotal - CreditTotal > 0";
0
Vahid Heydarinezhad 29 ene. 2016 a las 07:32

Es porque estás devolviendo un conjunto de registros, no una escalar Es porque estás devolviendo un conjunto de registros, no un escalar

ACTUALIZACIÓN: y también porque no tenía un espacio entre el nombre de la tabla y el comienzo de la cláusula where. Actualicé el ejemplo en consecuencia

A medida que se escribe su consulta, devolverá todas las facturas que cumplan con sus criterios. Entonces, si tiene 10 facturas con un TotalBalanceDue> 0, obtendrá 10 registros.

Si desea obtener un valor escalar, tendrá que restringir su consulta a una fila. Voy a adivinar con un ID de factura

string selectStatement =
            "SELECT SUM(InvoiceTotal - PaymantTotal - CreditTotal) " +
            "AS BalanceDue FROM Invoices" +
            " WHERE InvoiceTotal - PaymantTotal - CreditTotal > 0 AND INVOICEID = " + InvoiceId.ToString();

De lo contrario, tendrá que actualizar su código para poder acomodar múltiples filas de resultados

Tratar

public static String GetTotalBalanceDue() 
    {
        decimal totalBalanceDue;
        DataTable results = new DataTable();
        string selectStatement =
            "SELECT SUM(InvoiceTotal - PaymantTotal - CreditTotal) " +
            "AS BalanceDue FROM Invoices" +
            " WHERE InvoiceTotal - PaymantTotal - CreditTotal > 0";

        try
        {
            using (SqlConnection connection = PayablesDBConnection.GetConnection())
            {
                connection.Open();

                using (SqlCommand selectCommand = new SqlCommand(selectStatement, connection))
                {
                     using(SqlDataAdapter adapter = new SqlDataAdapter(selectCommand))
{
    adapter.Fill(results);
}
                }
            }


        }
        catch (SqlException ex)
        {
            //exceptions are thrown to the controller, then to the view
            //Please make sure that do not use MessageBox.Show(ex.Message) in the DAL
            //because it couples the DAL with the view

            //throw is used instead of throw ex because the former preserves the stack trace
            throw;
        }
        catch (Exception ex)
        {
            throw;
        }
1
Muckeypuck 29 ene. 2016 a las 04:29