2016-03-04 83 views
1

我短小精悍我可以执行一些SQL不使用Execute给予响应的可执行文件和querieable SQL语句混合:如何小巧玲珑

var sql = @"INSERT INTO Items (id, userId, name, description, isPublic) VALUES (@id, @userId, @name, @description, @isPublic)"; 
using (var connection = new SqlConnection(ConnectionString)) 
{ 
    connection.Execute(sql, new 
    { 
     id = value.Id, 
     userId = value.UserId, 
     name = value.Name, 
     description = value.Description, 
     isPublic = value.IsPublic 
    }); 
} 

我可以查询使用Query

var sql = @"SELECT * FROM Items WHERE id = @id"; 
using (var connection = new SqlConnection(ConnectionString)) 
{ 
    var item = connection.Query<Item>(sql, new { id = id }).Single(); 
    return item; 
} 

使用[QueryMultiple]()我可以同时发几个查询:

var sql = @"SELECT * FROM Collections WHERE id = @collectionId 
      SELECT * FROM Items WHERE id = @itemId"; 
using (var connection = new SqlConnection(ConnectionString)) 
{ 
    var multi = connection.QueryMultiple(sql, new { collectionId = collectionId, itemId = itemId }); 
    //... 

我将如何执行和查询一气呵成?即我怎么会叫这样的组合:

var sql = @"INSERT INTO Items (id, userId, name, description, isPublic) VALUES (@id, @userId, @name, @description, @isPublic) 
      SELECT * FROM Items WHERE id = @itemId";" 

回答

0

这是相当两岸前进:

[TestFixture] 
public class DapperTests 
{ 
    private SqlConnection _sqlConnection; 

    [SetUp] 
    public void Setup() 
    { 
     _sqlConnection = new SqlConnection(@"Data Source=.\sqlexpress; Integrated Security=true; Initial Catalog=MyDb"); 
     _sqlConnection.Open(); 

     _sqlConnection.Execute(@"IF (NOT EXISTS (SELECT * 
      FROM INFORMATION_SCHEMA.TABLES 
      WHERE TABLE_SCHEMA = 'dbo' 
      AND TABLE_NAME = 'temp')) 
      BEGIN 
       create table temp 
       (
        Id int IDENTITY(1,1), 
        Value varchar(10) 
       ) 
      END"); 
    } 

    [TearDown] 
    public void Teardown() 
    { 
     _sqlConnection.Close(); 
    } 

    [Test] 
    public void Test_Basic_Insert_Select() 
    { 
     var result = _sqlConnection.Query<int>("SELECT @value as Id into #temp; select Id from #temp where Id = @value", new { value = 1 }).Single(); 

     Assert.That(result, Is.EqualTo(1)); 
    } 

    [Test] 
    public void Test_Basic_Insert_Select_QueryMultiple() 
    { 
     var result = _sqlConnection.QueryMultiple("insert into temp(Value) select @value; select 1 as foo; select 'bar' as bar", new { value = 1 }); 

     var id = result.Read<int>().Single(); 
     var bar = result.Read<string>().Single(); 

     Assert.That(id, Is.EqualTo(1)); 
     Assert.That(bar, Is.EqualTo("bar")); 
    } 

    [Test] 
    public void Test_Identity() 
    { 
     var result = _sqlConnection.Query<int>("insert into temp(Value) select @value ;select Id from temp where Id = (SELECT SCOPE_IDENTITY())", new { value = 1 }); 

     Assert.That(result.Count(), Is.GreaterThan(0)); 
    } 
} 
+0

我没有得到这个遗憾,不知道如何回答我的问题。你的Dapper多重查询'“SELECT @value as Id into #temp; select#from #temp where Id = @value”'不使用'QueryMultiple'。这是要走的路吗? – dumbledad

+0

您问:“我怎么称呼这个组合”,其中组合是:一个插入和单个选择。如果您需要QueryMultiple,只需用它替换查询;我添加了一个新的测试... –