2012-12-12 3 views
1

Я хочу, чтобы вставить данные в таблицу базы данных:Как я могу решить эту ошибку в C#

myCommand.CommandText = "INSERT INTO Selectionner (IdPrestation, 
    IdPhrase, DegreUrgence,RisqueConcerne,rowguid,Cotation) " +                
    "VALUES ('" +new Guid(emp.IdPrestation) + 
    "', '" +new Guid(emp.IdPhrase)+ "', '" + 
    emp.DegreUrgence + "','" + emp.RisqueConcerne + "','" + 
    new Guid(emp.rowguid) + "','" + emp.Cotation + "')"; 

Но это возвращает ошибку:

Guid should contain 32 digits with 4 dashes
(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

Как я могу решить эту ошибку?

+5

Не конкатенации SQL строки, но параметры использования, чтобы избежать SQL-инъекций и разбора ошибок. Нам нужны значения следующих переменных для ответа на ваш вопрос: 'emp.IdPrestation',' emp.IdPhrase', 'emp.rowguid'. Вы используете их для инициализации «GUID», который должен содержать 32 цифры с четырьмя тире (ошибка не требует пояснений, не так ли?). –

+0

Не могли бы вы привести некоторые значения для emp.IdPrestation, emp.IdPhrase и emp.rowguid? – SWeko

ответ

6

Один или многие из ваших

emp.IdPrestation //Or 
emp.IdPhrase //Or 
emp.rowguid //Check them before creating 

является/не являются GUID. Именно поэтому это ошибка.

EDIT: начинает

Как использовать Guid.TryParse(), который возвращает истину, если операция разбора была успешной; в противном случае - false.

//How to parse safely 
Guid IdPrestation; 
Guid IdPhrase; 
Guid rowguid; 

if(Guid.TryParse(emp.IdPrestation, out IdPrestation) && 
    Guid.TryParse(emp.IdPhrase, out IdPhrase) && 
    Guid.TryParse(emp.rowguid, out rowguid)) 
{ 
    //all variables have been parse successfully 
    //Execute the sql query as follows using parameters 
} 

EDIT: заканчивается

Кроме того, передача параметров в прямой строки с встроенным SQL является unsafe bad practice. Вместо этого use a parameterised query.

myCommand.CommandText = "INSERT INTO yourTableName (c1, c2, ...) 
VALUES (@p1, @p2,...)"; 
myCommand.Parameters.Add(new SqlParameter("p1", valueforCol1)); 
myCommand.Parameters.Add(new SqlParameter("p2", valueforCol2)); 
... 
4

Попробуйте использовать параметризованный запрос в качестве первого улучшения.

Затем попробуйте использовать Guid.Parse(string s) вместо new Guid(string s). Таким образом, я ожидаю, что будет создано исключение для строк, которые не соответствуют требованиям.

Конструктор может быть немного дозволительным, и в этом случае вы захотите ускорить работу, чтобы вы знали, какое поле дает вам проблемы.

+0

сейчас, я использую 'Guid.Parse (string s)', но такую ​​же ошибку –

+0

, но является ли ошибка из-за невозможности выполнить парсинг? Или успешно выполняется Parse, но фактическая Вставка генерирует исключение? – dutzu

+0

@ B.M.A проверить мои последние изменения. – Kaf

1

Вы не можете создать GUID просто из строки, строка должна быть Guid соответствует

Guid originalGuid = Guid.NewGuid(); 
originalGuid.ToString("B") gets converted to {81a130d2-502f-4cf1-a376-63edeb000e9f} 

Аналогично

"N" - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (32 digits) 
"D" - xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (32 digits separated by hyphens) 
"B" - {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} (same as "D" with addition of braces) 
"P" - (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) (same as "D" with addition of parentheses) 
"X" - {0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00.0x00}} 

Сам справ не имеет формат. Это просто ценность. Обратите внимание, что вы можете создавать контуры с помощью NewGuid или с помощью конструктора guid. Используя NewGuid, вы не контролируете значение guid. Используя конструктор guid, вы можете контролировать значение. Использование конструктора полезно, если у вас уже есть строковое представление руководства (возможно, вы читаете его из базы данных) или если вы хотите упростить интерпретацию руководства во время разработки. Вы также можете использовать методы Parse, ParseExact, TryParse и TryParseExact.

Таким образом, вы можете создать GUIDs так:

Guid g1 = Guid.NewGuid(); //Get a Guid without any control over the contents 
Guid g2 = new Guid(new string('A',32)); //Get a Guid where all digits == 'A' 
Guid g3 = Guid.Parse(g1.ToString()); 
Guid g4 = Guid.ParseExact(g1.ToString("D"),"D"); 
Guid g5; 
bool b1 = Guid.TryParse(g1.ToString(), out g5); 
Guid g6; 
bool b2 = Guid.TryParseExact(g1.ToString("D"),"D", out g6); 
Смежные вопросы