代码之家  ›  专栏  ›  技术社区  ›  NevrMore

使用ServiceStack和C将数据发布到SQL Server#

  •  3
  • NevrMore  · 技术社区  · 6 年前

    我刚刚开始学习servicestack和c,我需要一些关于将数据发布到sql server的帮助。当我使用swagger进行测试时,我得到了200个响应,但实际上没有任何东西被插入到数据库中,我不确定哪里出错了。

    型号.类型

    public class Book
    {
        [PrimaryKey]
        [AutoIncrement]
        public int BookID { get; set; }
        public string Author { get; set; }
        public string Title { get; set; }
        public int NumberOfPages { get; set; }
        public int Isbn { get; set; }
    }
    

    管理器界面:

    namespace ServiceStackServiceLog4NetTemplate.Interfaces.Managers
    {
       public interface IPostBookManager
      {
        Book CreateBooks();
      }
    }
    

    存储库界面:

    namespace ServiceStackServiceLog4NetTemplate.Interfaces.Repositories
    {
       public interface IPostBookRepository
       {
         Book PostBooks();
       }
    }
    

    消息。请求

    namespace ServiceStackServiceLog4NetTemplate.ServiceModel.Messages
    {
    [Route("/PostBooks", Verbs = "POST")]
    public class PostBooksRequest
    {
        [AutoIncrement]
        public int BookID { get; set; }
        public string Author { get; set; }
        public string Title { get; set; }
        public int NumberOfPages { get; set; }
        public int Isbn { get; set; }
    }
    }
    

    消息。响应

    namespace ServiceStackServiceLog4NetTemplate.ServiceModel.Messages
    {
    public class PostBooksResponse : IHasResponseStatus
    {
        public Book Book { get; set; }
        public ResponseStatus ResponseStatus { get; set; }
    }
    }
    

    经理

        class PostBooksManager : IPostBookManager
        {
        private IPostBookRepository postRepo;
    
        public PostBooksManager(IPostBookRepository pRepo)
        {
            postRepo = pRepo;
        }
    
        public Book CreateBooks()
        {
            var bookCreations = postRepo.PostBooks();
            return bookCreations;
        }
    }
    }
    

    存储库

    namespace ServiceStackServiceLog4NetTemplate.Repositories
    {
    public class PostBookSqlRepo : IPostBookRepository
    {
        private readonly string connection = ConfigurationManager.AppSettings["BooksDB"];
    
        public Book PostBooks()
        {
            var postBooks = CreateBooks();
            return postBooks;
        }
    
        private Book CreateBooks()
        {
            var newBooks = new Book();
            string query = "INSERT INTO dbo.BooksTable(BookID, Author, Title, NumberOfPages, ISBN)" +
                           "VALUES(@BookID, @Author, @Title, @NumberOfPages, @ISBN)";
            SqlConnection dbConnect = new SqlConnection(connection);
            SqlCommand cmd = new SqlCommand(query, dbConnect);
    
    
            using (dbConnect)
            {
                dbConnect.Open();
    
    
                var b = new Book()
                {
                    BookID = newBooks.BookID,
                    Author = newBooks.Author,
                    Title = newBooks.Title,
                    NumberOfPages = newBooks.NumberOfPages,
                    Isbn = newBooks.Isbn
                };
    
                cmd.Parameters.AddWithValue("@BookID", b.BookID);
                cmd.Parameters.AddWithValue("@Author", b.Author);
                cmd.Parameters.AddWithValue("@Title", b.Title);
                cmd.Parameters.AddWithValue("@NumberOfPages", b.NumberOfPages);
                cmd.Parameters.AddWithValue("@ISBN", b.Isbn);
    
    
                dbConnect.Close();
            }
    
            return newBooks;
    
        }
    
    }
    }
    

    服务定义

    namespace ServiceStackServiceLog4NetTemplate.ServiceDefinition
    {
    [EnableCors(allowedMethods: "GET,POST,DELETE")]
    class PostBooksServiceDefinition : Service
    {
        private IPostBookManager postManager;
    
        public PostBooksServiceDefinition(IPostBookManager bookP)
        {
            postManager = bookP;
        }
    
        public object Post(PostBooksRequest request)
        {
            var postBook = request.ConvertTo<Book>();
    
            PostBooksResponse resp = new PostBooksResponse()
            {
                Book = postBook
            };
    
            return resp;
        }
    }
    }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   mythz    6 年前

    首先你不应该 [AutoIncrement] 根据您的请求DTO,您正在将DTO转换为 Book 对象,它是您正在保存的数据模型,而不是请求DTO(它不会对任何东西产生任何影响,只是不必要和未使用)。

    其次,你在使用 OrmLite 您的 数据模型,但您没有使用ormlite插入记录。

    使用ormlite插入新的 在ServiceStack服务中,您可以使用:

    Db.Insert(postBook);
    

    如果您还需要创建 RDBMS表,您可以创建它,如果它不存在的话:

    using (var db = dbFactory.Open())
    {
        db.CreateTableIfNotExists<Book>();
    }
    

    如果你还没有注册 OrmLiteConnectionFactory 使用ServiceStack,您可以将其注册到:

    container.Register<IDbConnectionFactory>(c => 
        new OrmLiteConnectionFactory(connString, SqlServer2012Dialect.Provider));
    

    有关详细信息,请参见Ormlite项目页上的文档:

    使用存储库

    如果你想使用 PostBookSqlRepo 要保存书本,您应该将其配置为 IDbConnectionFactory ,例如:

    public class PostBookSqlRepo : IPostBookRepository
    {
        IDbConnectionFactory dbFactory;
    
        public PostBookSqlRepo(IDbConnectionFactory dbFactory)
        {
            this.dbFactory = dbFactory;
        }
    
    //...
    
        public Book CreateBooks(Book book)
        {
            using (var db = dbFactory.OpenDbConnection())
            {
                db.Insert(book);
            }
        }
    }
    

    您可以在ServiceStack IOC中配置它:

    container.Register<IPostBookRepository>(c =>
        new PostBookSqlRepo(c.Resolve<IDbConnectionFactory>()));