我在玩弄这个。我将在应用程序中的对象上实现某种类型的缓存,但我想全面了解它是如何工作的。显示的所有数据均为假数据和测试数据。未使用PHI。
目标:将SQL表结果缓存到本地计算机上的文本文件中。
什么有效?
从SQL表创建的文本文件。
正在读取应用程序中的文本文件。
什么不起作用?
在列表框或组合框中显示数据。
发生了什么事?
文本文件整洁干净。每行1条记录。没有额外空间。当我将文本文件读入MessageBox时,宾果。漂亮、整洁、易读。当我将文本显示在组合框或列表框中时,每个全名中的每个字母都是一个新行。
XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="Name of Patient - " HorizontalAlignment="Center"
VerticalAlignment="Center"
Grid.Row="0" Grid.Column="0" />
<TextBox Name="FullName" VerticalContentAlignment="Center"
Text="{Binding Path=EmployeeName, Mode=TwoWay}"
Height="30" Width="150" HorizontalAlignment="Center"
VerticalAlignment="Center" Grid.Row="0" Grid.Column="1" />
<Button Name="Search" Content="Search" Click="Search_Click"
Grid.Row="0" Grid.Column="2" Height="30" Width="150" />
<ListBox Height="200" Width="200" Name="LbFullName"
ItemsSource="{Binding}" Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3" />
</Grid>
C#:
public partial class MainWindow
{
private readonly ObjectCache _cache = MemoryCache.Default;
public MainWindow()
{
InitializeComponent();
var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string dbFile = path + @"\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt";
SendSqlToText(dbFile);
}
private void Search_Click(object sender, RoutedEventArgs e)
{
if (!(_cache["cachecontents"] is string cacheContents))
{
var policy = new CacheItemPolicy {AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)};
var filePaths = new List<string>();
var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
filePaths.Add(path + "\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt");
policy.ChangeMonitors.Add(new
HostFileChangeMonitor(filePaths));
cacheContents =
File.ReadAllText(path + "\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt");
_cache.Set("cachecontents", cacheContents, policy);
LbFullName.DataContext = cacheContents;
MessageBox.Show(cacheContents);
}
}
private void SendSqlToText(string dbFile)
{
var conString = ConfigurationManager.ConnectionStrings["Dbconn"].ConnectionString;
using (var sqlConnection = new SqlConnection(conString))
{
var cmd = "SELECT FullName FROM[dbo].[PatientData]";
var command = new SqlCommand(cmd, sqlConnection);
sqlConnection.Open();
SqlDataReader sqlReader = command.ExecuteReader();
using (StreamWriter file = new StreamWriter(dbFile, false))
{
while (sqlReader.Read())
{
file.WriteLine(sqlReader["FullName"]);
}
}
}
}
}