2014-01-14 6 views
1

Я использую Azure для размещения моей базы данных. Наиболее распространенные решения этой проблемы, которые я нашел, связаны с неправильными данными в SQL-запросе. Я использую параметры, поэтому я бы не подумал, что это будет проблемой. Мои входные данные не содержат символов, которые SQL распознает для запроса. Я в тупике. Вот мой код.SQL Неверный синтаксис рядом с «,» при использовании параметризованного SQL

Public Function camp_UploadScoutRecord(ByVal recordID As String, ByVal requirementsID As String, ByVal scoutID As String, _ 
           ByVal scoutName As String, Optional ByVal unitType As String = "", Optional ByVal unitNumber As String = "", Optional ByVal district As String = "", _ 
           Optional ByVal council As String = "", Optional ByVal street As String = "", Optional ByVal city As String = "", Optional ByVal campName As String = "", Optional ByVal req1 As String = "", Optional ByVal req2 As String = "", _ 
           Optional ByVal req3 As String = "", Optional ByVal req4 As String = "", Optional ByVal req5 As String = "", Optional ByVal req6 As String = "", Optional ByVal req7 As String = "", _ 
           Optional ByVal req8 As String = "", Optional ByVal req9 As String = "", Optional ByVal req10 As String = "", Optional ByVal req11 As String = "", Optional ByVal req12 As String = "", _ 
           Optional ByVal req13 As String = "", Optional ByVal req14 As String = "", Optional ByVal req15 As String = "", Optional ByVal req16 As String = "", Optional ByVal req17 As String = "", _ 
           Optional ByVal req18 As String = "", Optional ByVal req19 As String = "", Optional ByVal req20 As String = "", Optional ByVal req21 As String = "", Optional ByVal req22 As String = "", _ 
           Optional ByVal badgeComplete As String = "", Optional ByVal badgeName As String = "", Optional ByVal subscriberID As String = "") As String Implements IMastersheetUpload.camp_UploadScoutRecord 

    Dim newRecordID As String 
     Dim dateToday As Date = Date.Today 
     newRecordID = Guid.NewGuid.ToString() 

     Dim selectcmd As New SqlCommand("SELECT * FROM campMeritBadgeRecords WHERE meritBadgeRequirementsID = @ID", myconn) 
     Dim sqlParam As New SqlParameter("@ID", newRecordID) 
     selectcmd.Parameters.Add(sqlParam) 
     Dim ds As New DataSet() 
     Dim da As New SqlDataAdapter(selectcmd) 
     da.Fill(ds) 

     'Find an unused recordID for this record 
     'If the GUID already exists in the database, then generate new one 
     If ds.Tables(0).Rows.Count <> 0 Then 
      While ds.Tables(0).Rows.Count <> 0 
       newRecordID = Guid.NewGuid.ToString() 
       da.Fill(ds) 
      End While 
     End If 

    Dim insertCMD As New SqlCommand("INSERT INTO campMeritBadgeRecords " + _ 
             "VALUES (@recordID," + _ 
             "@meritBadgeRequirementsID," + _ 
             "@scoutID," + _ 
             "@lastUpdated," + _ 
             "@scoutName," + _ 
             "@unitType," + _ 
             "@unitNumber," + _ 
             "@district," + _ 
             "@council," + _ 
             "@street," + _ 
             "@city," + _ 
             "@req1Complete," + _ 
             "@req2Complete," + _ 
             "@req3Complete," + _ 
             "@req4Complete," + _ 
             "@req5Complete," + _ 
             "@req6Complete," + _ 
             "@req7Complete," + _ 
             "@req8Complete," + _ 
             "@req9Complete," + _ 
             "@req10Complete," + _ 
             "@req11Complete," + _ 
             "@req12Complete," + _ 
             "@req13Complete," + _ 
             "@req14Complete," + _ 
             "@req15Complete," + _ 
             "@req16Complete," + _ 
             "@req17Complete," + _ 
             "@req18Complete," + _ 
             "@req19Complete," + _ 
             "@req20Complete," + _ 
             "@req21Complete," + _ 
             "@req22Complete," + _ 
             "@badgeComplete," + _ 
             "@campName," + _ 
             "@badgeName," + _ 
             "@uploadSubscriberID);", myconn) 

     With insertCMD.Parameters 
      'Record Info 
      .AddWithValue("@recordID", newRecordID) 
      .AddWithValue("@meritBadgeRequirementsID", requirementsID) 

      'Scout Info 
      .AddWithValue("@scoutID", scoutID) 
      .AddWithValue("@lastUpdated", Date.Today.ToString) 
      .AddWithValue("@scoutName", scoutName) 
      .AddWithValue("@unitType", unitType) 
      .AddWithValue("@unitNumber", unitNumber) 
      .AddWithValue("@district", district) 
      .AddWithValue("@council", council) 
      .AddWithValue("@street", street) 
      .AddWithValue("@city", city) 

      'Merit Badge Completion Info 
      .AddWithValue("@req1Complete", req1) 
      .AddWithValue("@req2Complete", req2) 
      .AddWithValue("@req3Complete", req3) 
      .AddWithValue("@req4Complete", req4) 
      .AddWithValue("@req5Complete", req5) 
      .AddWithValue("@req6Complete", req6) 
      .AddWithValue("@req7Complete", req7) 
      .AddWithValue("@req8Complete", req8) 
      .AddWithValue("@req9Complete", req9) 
      .AddWithValue("@req10Complete", req10) 
      .AddWithValue("@req11Complete", req11) 
      .AddWithValue("@req12Complete", req12) 
      .AddWithValue("@req13Complete", req13) 
      .AddWithValue("@req14Complete", req14) 
      .AddWithValue("@req15Complete", req15) 
      .AddWithValue("@req16Complete", req16) 
      .AddWithValue("@req17Complete", req17) 
      .AddWithValue("@req18Complete", req18) 
      .AddWithValue("@req19Complete", req19) 
      .AddWithValue("@req20Complete", req20) 
      .AddWithValue("@req21Complete", req21) 
      .AddWithValue("@req22Complete", req22) 
      .AddWithValue("@badgeComplete", badgeComplete) 
      .AddWithValue("@campName", campName) 
      .AddWithValue("@badgeName", badgeName) 
      .AddWithValue("@uploadSubscriberID", subscriberID) 
     End With 

     insertCMD.ExecuteNonQuery() 

     myconn.Close() 

     'Return recordID to tablet software for future record updates 
     Return newRecordID 
+1

Используйте SQLProfiler инструмент и контролировать то, что запрос выполняет ваш SQL двигатель. –

+1

Что происходит, когда что-то приходит с 23-м требованием (я предполагаю, что это то, что «req» не хватает)? Было бы гораздо разумнее, если бы эти значения хранились в их собственной таблице - по одной строке для каждого требования, возможно, с именами столбцов 'recordId',' RequirementOrdinal', 'Complete'. (Или, возможно, пропустите столбец 'complete' и таблица представит« завершенные требования »- наличие определенной строки указывает на завершение этого требования). –

+0

Я, вероятно, должен добавить некоторый фон. Это часть усилий по оцифровке записей о знаменах летнего лагеря для совета бойскаутов. 22 слота требований основаны на бумажной форме, которая не сильно изменилась с 1985 года или около того. Выполненные фактические требования загружаются в другую таблицу для уменьшения дублирования данных. Оцифровка записей должна сэкономить около 150 человеко-часов труда каждую неделю, не заполняя бумажные формы, но чтобы соответствовать требованиям национального офиса, мы не можем сильно отличаться от первоначальной формы. – Tonkaman

ответ

1

Я думаю, ваша ошибка в инструкции insert.

Где имя таблицы campMeritBadgeRecords и values объединены в вставной заявление, так что вы должны добавить дополнительное место после имени таблицы campMeritBadgeRecords

Так что ваше заявление будет как то

Dim insertCMD As New SqlCommand("INSERT INTO campMeritBadgeRecords values" + _ 
1

Мое предположение было бы эта линия ...

INSERT INTO campMeritBadgeRecords" + _ 
"VALUES (@recordID," + _ 

Вы не оставляя пространство между campMeritBadgeRecords и ЦЕННОСТЕЙ, поэтому SQL Server считывает его как

INSERT INTO campMeritBadgeRecordsVALUES(
+0

Я добавил пространство, и я все еще получаю ту же ошибку. Я добавил больше кода к моему вопросу, чтобы лучше понять, что он делает. – Tonkaman

+0

@Tonkaman - Вашему обновленному коду все еще не хватает места между именем таблицы и ключевым словом VALUES. –

0

Первое, что я хотел бы сделать двойная проверка, чтобы убедиться, что значения параметров являются действительными типами конвертируемых sql-конвертируемых типов. Например, значение Nothing в ваших параметрах может сбросить весь запрос, так как Nothing VB.NET не получает неявно преобразованного в SQL (для этого у нас есть DBNull). Если вы не используете ORM (который, как вам кажется, нет), вы можете либо использовать коалесцирующий оператор If(), либо обернуть If операторы вокруг любых потенциально нулевых значений (например, строки).

Например:

With insertCMD.Parameters 
    ' coalesce example 
    .AddWithValue("@district", If(district, DBNull.Value)) 

    ' If ... Then example 
    If req2 IsNot Nothing Then 
     .AddWithValue("@council", council) 
    Else 
     .AddWithValue("@council", DbNull.Value) 
    End If  
End With 

Как уже отмечался, также может быть проблемой с форматированием где-то в этом многострочном запросе. Для того, чтобы сделать его более удобным для чтения, вы можете включить его, чтобы использовать синтаксис литерала XML, как в ответах на этот вопрос: Multiline strings in VB.NET

Dim sqlString = _ 
    <![CDATA[ 
     INSERT INTO campMeritBadgeRecords 
     VALUES (
      @recordID, 
      @meritBadgeRequirementsID, 
      @scoutID, 
      @lastUpdated, 
      @scoutName, 
      @unitType, 
      @unitNumber, 
      @district, 
      @council, 
      @street, 
      @city, 
      @req1Complete, 
      @req2Complete, 
      @req3Complete, 
      @req4Complete, 
      @req5Complete, 
      @req6Complete, 
      @req7Complete, 
      @req8Complete, 
      @req9Complete, 
      @req10Complete, 
      @req11Complete, 
      @req12Complete, 
      @req13Complete, 
      @req14Complete, 
      @req15Complete, 
      @req16Complete, 
      @req17Complete, 
      @req18Complete, 
      @req19Complete, 
      @req20Complete, 
      @req21Complete, 
      @req22Complete, 
      @badgeComplete, 
      @campName, 
      @badgeName, 
      @uploadSubscriberID 
     ); 
    ]]>.Value 

Dim insertCMD As New SqlCommand(sqlString, myconn) 
Смежные вопросы