2016-12-06 10 views
0

У меня есть две таблицы, ACTB и ACXL, обе таблицы доступа в моей программе. В моих целях я хочу очистить содержимое ACXL в конце моего запроса.C# Первый раз, используя запрос update/internal join, получив синтаксическую ошибку

Резюме:

В программе, пользователь получает доступ к OpenFileDialog и выбирает файл Excel. указанный файл вставляется в ACXL. ACXL сопоставляется с ACTB по уникальному полю ID и обновляет записи, добавляя их значения. Вот мой код:

    string sqls = @"INSERT INTO ACXL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" + openFileDialog.FileName + "].[" + txtSheetName.Text + "$];"; 
        OleDbCommand cmd = new OleDbCommand(); 
        cmd.Connection = conn; 
        cmd.CommandText = sqls; 
        cmd.ExecuteNonQuery(); 
        string updater = @"UPDATE ACTB inner join ACXL on ACTB.ID = ACXL.ID " + 
            @"SET ACTB.GrossIncome + ACXL.GrossIncome " + 
            @"ACTB.LessTNT + ACXL.LessTNT " + 
            @"ACTB.TaxableIncomeCE + ACXL.TaxableIncomeCE " + 
            @"ACTB.TaxableIncomePE + ACXL.TaxableIncomePE " + 
            @"ACTB.GrossTaxableIncome + ACXL.GrossTaxableIncome " + 
            @"ACTB.LessTE + ACXL.LessTE " + 
            @"ACTB.LessPPH + ACXL.LessPPH " + 
            @"ACTB.NetTax + ACXL.NetTax " + 
            @"ACTB.TaxDue + ACXL.TaxDue " + 
            @"ACTB.HeldTaxCE + ACXL.HeldTaxCE " + 
            @"ACTB.HeldTaxPE + ACXL.HeldTaxPE " + 
            @"ACTB.TotalTax + ACXL.TotalTax"; 
        cmd.CommandText = updater; 
        cmd.ExecuteNonQuery(); 
        string deleter = @"DELETE from ACXL"; 
        cmd.CommandText = deleter; 
        cmd.ExecuteNonQuery(); 

Получение довольно расплывчатой ​​ошибки синтаксиса команды UPDATE. Здесь что-нибудь не так? Является ли это правильным способом достижения моей цели? Это как вы добавляете значения двух таблиц?

EDIT:

Проблема решена, вот что мы придумали:

    string updater = 
         @"UPDATE ACTB " + @"INNER JOIN ACXL on ACTB.ID = ACXL.ID "+ 
         @"SET ACTB.GrossIncome = ACTB.GrossIncome + ACXL.GrossIncome, " + 
         @"ACTB.LessTNT = ACTB.LessTNT + ACXL.LessTNT, " + 
         @"ACTB.TaxableIncomeCE = ACTB.TaxableIncomeCE + ACXL.TaxableIncomeCE, " + 
         @"ACTB.TaxableIncomePE = ACTB.TaxableIncomePE + ACXL.TaxableIncomePE, " + 
         @"ACTB.GrossTaxableIncome = ACTB.GrossTaxableIncome + ACXL.GrossTaxableIncome, " + 
         @"ACTB.LessTE = ACTB.LessTE + ACXL.LessTE, " + 
         @"ACTB.LessPPH = ACTB.LessPPH + ACXL.LessPPH, " + 
         @"ACTB.NetTax = ACTB.NetTax + ACXL.NetTax, " + 
         @"ACTB.TaxDue = ACTB.TaxDue + ACXL.TaxDue, " + 
         @"ACTB.HeldTaxCE = ACTB.HeldTaxCE + ACXL.HeldTaxCE, " + 
         @"ACTB.HeldTaxPE = ACTB.HeldTaxPE + ACXL.HeldTaxPE, " + 
         @"ACTB.TotalTax = ACTB.TotalTax + ACXL.TotalTax "; 
+0

Возможный дубликат [Синтаксис запроса SQL-запроса с внутренним соединением] (http://stackoverflow.com/questions/3867164/sql-update-query-syntax-with-inner-join) –

+0

Зачем использовать @ в каждой строке? Вы можете поставить один вперед, а затем поместить все между одним набором кавычек. См. Http://stackoverflow.com/questions/1100260/multiline-string-literal-in-c-sharp –

+1

@jeffcarey Временная мера, я не хочу, чтобы плюс становился красным, поскольку я мог пренебрегать этим. Я сделаю это одним из заявлений, после того как я закончу манипулировать им. – Aroueterra

ответ

1

Синтаксис вашего update .. set действительно выключен. Для установки столбцов вам не хватает всех знаков «=».

Наиболее используемый синтаксис SQL Update это (пример)

update mytable set column1 = value, column1 = value2 where id = someid т.д.

так что ваш SQL должен быть установлен следующим образом:

string updater = @"UPDATE ACTB " + 
        @"INNER JOIN ACXL on ACTB.ID = ACXL.ID "; 
        @"SET ACTB.GrossIncome = ACTB.GrossIncome + ACXL.GrossIncome, " + 
        @"ACTB.LessTNT = ACTB.LessTNT + ACXL.LessTNT, " + 
        @"ACTB.TaxableIncomeCE = ACTB.TaxableIncomeCE + ACXL.TaxableIncomeCE, " + 
        @"ACTB.TaxableIncomePE = ACTB.TaxableIncomePE + ACXL.TaxableIncomePE, " + 
        @"ACTB.GrossTaxableIncome = ACTB.GrossTaxableIncome + ACXL.GrossTaxableIncome, " + 
        @"ACTB.LessTE = ACTB.LessTE + ACXL.LessTE, " + 
        @"ACTB.LessPPH = ACTB.LessPPH + ACXL.LessPPH, " + 
        @"ACTB.NetTax = ACTB.NetTax + ACXL.NetTax, " + 
        @"ACTB.TaxDue = ACTB.TaxDue + ACXL.TaxDue, " + 
        @"ACTB.HeldTaxCE = ACTB.HeldTaxCE + ACXL.HeldTaxCE, " + 
        @"ACTB.HeldTaxPE = ACTB.HeldTaxPE + ACXL.HeldTaxPE, " + 
        @"ACTB.TotalTax = ACTB.TotalTax + ACXL.TotalTax "; 
+1

Вы имеете в виду запятую? Я напишу один, где набор появится сразу после инструкции обновления и последует за ним с помощью внутреннего соединения и посмотрим, что произойдет. – Aroueterra

+1

Я отредактировал OP и обновил его с вашим предложением. Где я могу поставить предложение where? мне кажется, что он обрабатывается операцией join-on value1 = value2. – Aroueterra

+1

Внутреннее соединение отлично, но вы не указываете SQL, какой столбец вы устанавливаете. SET ожидает, что за всеми столбцами следует равный оператор '='. В вашем случае у вас есть знаки +. – John

4

В вашем использовании запроса UPDATEWHERE раздел , Это решит проблему с синтаксической ошибкой.