2017-11-07 8 views
2

ASP.net Identity 프로젝트에서 dapper와 MySql을 사용하는 데 문제가 있습니다. 테이블 사용자에게 사용자를 삽입하고이 삽입에서 자동 생성 된 ID를 다시 원합니다. 하지만 구문 오류가 발생하고 이유를 모르겠습니다.Dapper MySQL 반환 값

이 메소드 삽입 내 코드입니다 :

public void Insert(TUser member) 
     { 
      var id = db.Connection.ExecuteScalar<int>(@"Insert into users 
            (UserName, PasswordHash, SecurityStamp,Email,EmailConfirmed,PhoneNumber,PhoneNumberConfirmed, AccessFailedCount,LockoutEnabled,LockoutEndDateUtc,TwoFactorEnabled) 
          values (@name, @pwdHash, @SecStamp,@email,@emailconfirmed,@phonenumber,@phonenumberconfirmed,@accesscount,@lockoutenabled,@lockoutenddate,@twofactorenabled) 
          SELECT Cast(LAST_INSERT_ID() as AS UNSIGNED INTEGER)", 
           new 
           { 
            name = member.UserName, 
            pwdHash = member.PasswordHash, 
            SecStamp = member.SecurityStamp, 
            email = member.Email, 
            emailconfirmed = member.EmailConfirmed, 
            phonenumber = member.PhoneNumber, 
            phonenumberconfirmed = member.PhoneNumberConfirmed, 
            accesscount = member.AccessFailedCount, 
            lockoutenabled = member.LockoutEnabled, 
            lockoutenddate = member.LockoutEndDateUtc, 
            twofactorenabled = member.TwoFactorEnabled 
           }); 
      // we need to set the id to the returned identity generated from the db 
      member.Id = id; 
     } 

이 내 테이블 사용자입니다 :

CREATE TABLE `users` (
    `Id` int(36) NOT NULL, 
    `Email` varchar(256) DEFAULT NULL, 
    `EmailConfirmed` tinyint(1) NOT NULL, 
    `PasswordHash` longtext, 
    `SecurityStamp` longtext, 
    `PhoneNumber` longtext, 
    `PhoneNumberConfirmed` tinyint(1) NOT NULL, 
    `TwoFactorEnabled` tinyint(1) NOT NULL, 
    `LockoutEndDateUtc` datetime DEFAULT NULL, 
    `LockoutEnabled` tinyint(1) NOT NULL, 
    `AccessFailedCount` int(11) NOT NULL, 
    `UserName` varchar(256) NOT NULL, 
    `FirstName` varchar(50) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

ALTER TABLE `users` 
    ADD PRIMARY KEY (`Id`); 

ALTER TABLE `users` 
    MODIFY `Id` int(36) NOT NULL AUTO_INCREMENT; 

오류 메시지 : 당신은 당신의 SQL 구문에 오류가 있습니다; 라인 4에서 'SELECT Cast (LAST_INSERT_ID() as AS UNSERTED INTEGER)'근처에서 사용할 올바른 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인하십시오.

LAST_INSERT_ID가 마지막 자동 수신 userid를 제공한다고 생각 했습니까? 당신이 설명한대로 도움

답변

1

LAST_INSERT_ID에 대한

덕분에 작동합니다,하지만 당신은 때문에 그것의 끝에 세미콜론을 포함하지 않도록 이전 삽입 문에 관련이없는 오류가 있습니다. MySQL에서 구문 오류를 진단 할 때 오류 메시지에 포함 된 SQL 문자열은 일반적으로 구문 오류 직후입니다.

가독성을 위해 구문을 재구성 해보십시오. 이렇게하면 더 쉽게 구문 오류를 식별 할 수 있습니다. 예를 들어 :

public void Insert(TUser member) 
{ 
    string sql = @" 
     Insert into users 
      (UserName, PasswordHash, SecurityStamp, Email, EmailConfirmed, PhoneNumber, PhoneNumberConfirmed, AccessFailedCount, LockoutEnabled, LockoutEndDateUtc, TwoFactorEnabled) 
     values 
      (@name, @pwdHash, @SecStamp, @email, @emailconfirmed, @phonenumber, @phonenumberconfirmed, @accesscount, @lockoutenabled, @lockoutenddate, @twofactorenabled); 

     select LAST_INSERT_ID(); 
    "; 

    member.Id = db.Connection.ExecuteScalar<int>(sql, new 
    { 
     name = member.UserName, 
     pwdHash = member.PasswordHash, 
     SecStamp = member.SecurityStamp, 
     email = member.Email, 
     emailconfirmed = member.EmailConfirmed, 
     phonenumber = member.PhoneNumber, 
     phonenumberconfirmed = member.PhoneNumberConfirmed, 
     accesscount = member.AccessFailedCount, 
     lockoutenabled = member.LockoutEnabled, 
     lockoutenddate = member.LockoutEndDateUtc, 
     twofactorenabled = member.TwoFactorEnabled 
    }); 
} 

this answer 당, 당신은 또한 당신이 최근 MySQL 버전을 실행하는 경우 LAST_INSERT_ID에 캐스팅을 제거 할 수 있습니다.