无法在Xamarin.Forms上使用System.Data.SqlClient

时间:2017-01-08 16:44:38

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

SQLite是向Xamarin.Forms应用程序实现SQL数据库的推荐方法。

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

操作实例

1。添加SQLite NuGet包

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

2。创建数据库类

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

此数据库类将用于将数据保存到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。

此接口允许您使用Dependancy Service使用特定于平台的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