【问题标题】:Can't use System.Data.SqlClient on Xamarin.Forms无法在 Xamarin.Forms 上使用 System.Data.SqlClient
【发布时间】:2017-01-08 16:44:38
【问题描述】:

我需要在使用 Xamarin.Forms 开发的应用程序上使用 System.Data.SqlClient,但我无法使用此包。我尝试将它添加到“.Droid”项目中(它似乎在 PCL 上不可用),但在命名空间中找不到它。我通过 Visual Studio 2015 中的 NuGet 包管理器添加了它。

我需要做类似in here 的事情。我知道不推荐。我计划稍后开发一个 REST API,但现在我需要这样做以构建应用程序的原型/alpha 版本。

编辑:如果我不能使用 SqlClient,我可以在 Xamarin 中使用什么来打开与 SQL Server 的连接?

【问题讨论】:

  • 不久前我在使用 Xamarin 时遇到了同样的问题。据我所知,SQLite 是受支持的。然而,我确实开始工作的是带有 Xamarin 的 Azure SQL,它工作得非常好,我认为你应该能够使用 SQL Server Management Studio。我认为您的 OP 中实际上并没有提出问题,所以我的评论是阅读您的帖子后的一种想法。
  • 您可以在 iOS 等 Mono 项目中包含对 System.Data 和 Mono.Data.Tds 的引用,并直接连接到 MSSQL。但是,这样做意味着您必须在 MSSQL Server 上启用 TCP/IP 以允许 iOS 或 Android 设备直接连接到 MSSQL,这会带来潜在的安全风险。最好将数据放在经过身份验证的 ASP.NET Core JSON API 后面,然后通过 Xamarin 使用。

标签: c# xamarin xamarin.android xamarin.forms


【解决方案1】:

如果您想使用System.Data.SqlClient,您将需要使用您链接到自己的帖子中提到的方法。一个简单的原因是该软件包不是作为 PCL 构建的。

如果这不可行,请使用与 PCL 兼容的 SQLite.NET package

【讨论】:

    【解决方案2】:

    在您的应用中从NuGet 下载system.data.sqlite 包。它将为您提供 system.datasystem.data.sqlclientsystem.data.sqlLite 等程序集以及更多用于数据库连接的程序集。

    【讨论】:

      【解决方案3】:

      SQLite 是在 Xamarin.Forms 应用中实现 SQL 数据库的推荐方法。

      这是将 SQLite 添加到 Xamarin.Forms 应用程序的演练!

      演练

      1。添加 SQLite NuGet 包

      @Frank Krueger创建的SQLite-net NuGet添加到您解决方案中的每个项目中;即将这个 NuGet 包添加到您的 Xamarin.Forms PCL、Android 项目等中。

      2。创建数据库类

      将此类添加到您的 Xamarin.Forms PCL。

      此数据库类将用于将数据保存到您的 SQLite 数据库,以及从您的 SQLite 数据库中加载数据。

      public class Database
      {
          #region Constant Fields
          readonly static object _locker = new object();
          readonly SQLiteConnection _database;
          #endregion
      
          #region Constructors
          public Database()
          {
              _database = DependencyService.Get<ISQLite>().GetConnection();
              _database.CreateTable<DataModel>();
          }
          #endregion
      
          #region Methods
          public async Task<IList<DataModel>> GetAllDataAsync()
          {
              return await Task.Run(() =>
              {
                  lock (_locker)
                  {
                      return _database.Table<DataModel>().ToList();
                  }
              });
          }
      
          public async Task<int> SaveDataAsync(DataModel dataModel)
          {
              var isDataInDatabase = (await GetAllDataAsync()).FirstOrDefault(x => x.Equals(dataModel)) != null;
      
              return await Task.Run(() =>
              {
                  if (isDataInDatabase)
                  {
                      lock (_locker)
                      {
                          _database.Update(dataModel);
                      }
                      return dataModel.ID;
                  }
      
                  lock (_locker)
                  {
                      return _database.Insert(dataModel);
                  }
              });
          }
          #endregion
      

      3。创建 ISQLite 接口

      将此接口添加到 Xamarin.Forms PCL。

      此接口将允许您使用依赖服务通过特定于平台的 API 检索数据库连接

      public interface ISQLite
      {
          SQLiteConnection GetConnection();
      }
      

      4。创建 ISQLite 的 iOS 实现

      将此类添加到您的 Android PCL

      此 ISQLite 数据库实现将使用 Xamarin.Android 文件夹路径检索数据库连接。

      [assembly: Dependency(typeof(SQLite_Android))]
      namespace SampleApp.Droid
      {
          public class SQLite_Android : ISQLite
          {
              #region ISQLite implementation
              public SQLiteConnection GetConnection()
              {
                  var sqliteFilename = "SQLiteDatabase.db3";
                  string documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); // Documents folder
                  var path = Path.Combine(documentsPath, sqliteFilename);
      
                  var conn = new SQLiteConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache);
      
                  // Return the database connection 
                  return conn;
              }
              #endregion
          }
      }
      

      5。在 App.cs 中,将静态实现添加到数据库中

      将此 Database.cs 的静态实现添加到 Xamarin.Forms PCL 的 App 类中。

      public class App : Application
      {
          static OpportunityModelDatabase _database;
      
          ...
      
          public static OpportunityModelDatabase Database =>
              _database ?? (_database = new OpportunityModelDatabase());
      }
      

      6。现在从您应用中的任何位置访问数据库数据

      这是一个如何从不同类中检索数据的示例

      var AllData = await App.Database.GetAllDataAsync();
      

      示例应用

      这是我创建的示例应用程序,它演示了如何在 Xamarin.Forms 应用程序中实现 SQLite。随意下载它以更好地了解如何实现 SQLite! https://github.com/brminnick/InvestmentDataSampleApp

      【讨论】:

      • 我不想实现本地数据库。我希望我的应用连接到存储在 SQL Server 上的远程数据库。
      • @jorgemoreira 您的数据是否托管在 Azure 上?
      • 那么您需要编写完全独立于 SQL 数据库的前端(GUI/手机等),并使用 Http 调用(不是 SQL 连接)到非 GUI 后端服务Http请求,执行SQL并返回数据。这是通过这个开发“系统”沼泽的唯一途径......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多